【OpenCV+OCR】计算机视觉:识别图像验证码中指定颜色文字

news2024/11/18 9:37:50

文章目录

  • 1. 写在前面
  • 2. 读取验证码图像
  • 3. 生成颜色掩码
  • 4. 生成黑白结果图
  • 5. OCR文字识别
  • 6. 测试结果

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  今天给大家带来一个爬虫领域过花式验证码小技巧,这是最近来源于一位铁子的分享,验证码是下面这样的(可以看到附带了某些条件,比如说输入特定颜色的字符):

在这里插入图片描述
在这里插入图片描述

在此之前我专门去开源社区找了找一些成熟的解决方案,确实有多种花式处理的方案,相比于自己去收集样本,训练一个识别模型,其中数据样本的标注是比较耗时的,想要保持较高的准确率,这是一件持续的事情,因为你需要让你的模型有能够适应更新带来的对抗。又或者是打码平台的低效率,这次分享的方式更加实用:

在这里插入图片描述

话不多说,核心代码其实也就几十行,轻轻松松识别上面类型的验证码,代码的核心思想就下面四步:

1、颜色空间转换
2、根据HSV颜色阈值生成掩码
3、生成黑白结果图
4、OCR文字内容识别

通俗点讲就是剔除与需提取颜色无关的内容,最后识别!

HSV颜色阈值参考如下(具体自己可以调节):

在这里插入图片描述

2. 读取验证码图像

  首先将事先准备好的验证码图片,然后通过程序读取图片,代码如下:

def read_image(image_path):
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError(f"读取图片失败: {image_path}")
    return img

3. 生成颜色掩码

  HSV(色调、饱和度、亮度)颜色空间是一种表示颜色空间的模型,类似于 RGB 颜色模型

我们可以根据上面HSV范围的阈值范围,使用cv2.inRange函数生成二值掩码。掩码中的目标颜色对应的区域被设为白色(255),其他颜色对应的区域被设为黑色(0)

def apply_color_mask(hsv, lower, upper):
    return cv2.inRange(hsv, np.array(lower), np.array(upper))

4. 生成黑白结果图

  生成黑白结果图的目的就是将指定颜色的内容从原始图像中提取出来,以便进行后续的OCR文字识别。在验证码的应用场景中,验证码可能包含多个颜色,而我们只对其中某一种颜色感兴趣。通过生成黑白结果图,我们可以将感兴趣的颜色保留下来,而将其他颜色置为白色,从而突出需要识别的内容,代码如下:

def generate_result_image(img, mask, result_path):
    result = np.zeros_like(img)
    result[mask == 255] = [0, 0, 0]
    result[mask != 255] = [255, 255, 255]
    cv2.imwrite(result_path, result)

这是验证码图片处理完生成黑白图的效果:

在这里插入图片描述

5. OCR文字识别

  最后借助OCR对黑白结果图进行识别,基本上成功率在90%以上,基本够用,识别代码如下:

def ocr_classification(image_path):
    try:
        with open(image_path, 'rb') as f:
            img_bytes = f.read()
        ocr = ddddocr.DdddOcr(show_ad=False)
        return ocr.classification(img_bytes)
    except Exception as e:
        raise ValueError(f"OCR识别出错: {e}")

def verification_ocr(image_path, tips):
    """验证码识别主函数

    Args:
      image_path: 图像文件路径
      tips: 识别提示, 包括"红色"、"黄色"、"蓝色"、"全部"

    Returns:
      result: OCR识别结果
    """
    result_path = "1.png"
    img = read_image(image_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    color_ranges = {
        "红色": ([0, 50, 50], [10, 255, 255], [170, 50, 50], [180, 255, 255]),
        "黄色": ([17, 45, 50], [34, 255, 255]),
        "蓝色": ([100, 50, 50], [130, 255, 255]),
    }

    if tips in color_ranges:
        ranges = color_ranges[tips]
        mask = apply_color_mask(hsv, *ranges[:3])
        if tips == "红色":
            mask2 = apply_color_mask(hsv, *ranges[2:])
            mask = cv2.bitwise_or(mask, mask2)
        generate_result_image(img, mask, result_path)

    with open(result_path, 'rb') as f:
        img_bytes = f.read()
    ocr = ddddocr.DdddOcr(show_ad=False)
    res = ocr.classification(img_bytes)
    #输出识别内容
    print(res)

tips参数代表传入的颜色,并根据颜色去选择阈值

cv2.cvtColor(img, cv2.COLOR_BGR2HSV)将图像从BGR色彩空间转换为HSV色彩空间。HSV(色调、饱和度、明度)通常更适合基于颜色的图像处理

ddddocr这个库自然不用多说了,很好用。可以满足很对场景下的使用需求,开源的力量!

6. 测试结果

在这里插入图片描述

如果你只是为了解决这类验证码识别为目的,那么这个方案完全是够用的!最后,其实还是建议大家体验一下自己训练样本的过程,打造一个高质量的model

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity实战】按物品掉落率,随机掉落战利品物品系统(附项目源码)

文章目录 前言开始参考源码完结 前言 当开发游戏时,一个常见的需求是实现一个物品随机掉落系统。这个系统可以让玩家在击败敌人或完成任务后获得随机的物品奖励,增加游戏的可玩性和乐趣。 在Unity中,我们可以通过编写代码来实现这样的战利品…

大模型AI Agent 前沿调研

前言 大模型技术百花齐放,越来越多,同时大模型的落地也在紧锣密鼓的进行着,其中Agent智能体这个概念可谓是火的一滩糊涂。 今天就分享一些Agent相关的前沿研究(仅限基于大模型的AI Agent研究),包括一些论…

Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂

目录 前言 一 首先我为啥要重装Vs Code呢? 二 下载1.84.2Visual Studio Code 三 配置Vscode终端字体 四 安装插件 前言 这是一篇将老版本的VsCode下载至最新版的博文,从下载到调试全篇 一 首先我为啥要重装Vs Code呢? 因为我想安装这个…

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…

2023年全国大学生数学建模竞赛总结

2023年全国大学生数学建模竞赛总结 一.参赛经历二.组队建议赛前准备建模手所需要具备的知识 编程手需要具备的能力 论文手论文手需要学习的知识 比赛过程 全国大学生数学建模竞赛的比赛落下了帷幕,很荣幸我能够获得国家二等奖,这对于我们队伍来说是十分荣幸的,接下来让我进行我…

UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南

UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南" 目录 uniapp进行打包 使用上架工具appuplode进行发包 1.登录appuploder软件 2.登陆开发者App Store后台 uniapp进行打包 在HBuilder X编辑器中打开需要打包的项目,然后…

电脑自动删除文件怎么办?如何恢复?

在数字化时代,电脑已经成为人们不可或缺的工具之一。然而,由于各种原因,我们有时会遇到电脑自动删除文件的情况,这给我们的工作和生活带来了很多不便。那么,当电脑自动删除文件时,我们应该如何处理呢&#…

redis-cluster集群(目的:高可用)

1、特点 集群由多个node节点组成,redis数据分布在这些节点中,在集群中分为主节点和从节点,一个主对应一个从,所有组的主从形成一个集群,每组的数据是独立的,并且集群自带哨兵模式 2、工作原理 集群模式中…

Cookie、Session、CBV加装饰器的三种方法

【0】cookie、session和Token的发展史 【1】Cookie的形式 存储形式:k:v键值对存储位置:客户端缺点:不安全,信息可能会泄露 【2】session的形式 标识符,表示我是当前用户加密出来的数据对敏感信息进行加密…

element-plus的el-dropdown去除鼠标悬浮或点击时的黑边框

设置为outline:unset;或者outline:none;即可 :deep(.el-tooltip__trigger:focus-visible) {outline: unset;}

解决traefik/nginx-ingress-controller配置正确的情况访问域名仍然报错: Connection Refused的问题

最近碰到一个很奇怪的问题: traefik/nginx-ingress-controller配置正确,但是访问ingress配置的host域名就是死活报错: Connection Refused 这样怎么也找不到原因,然后一咬牙直接在其中一台节点yum安装nginx, 通过直接反向代理的方…

高通OTA升级非常规分区方法

高通OTA升级非常规分区方法 1. 高通LE OTA背景2. 高通LE OTA升级方案2.1 SDX12 OTA方案2.2 OTA升级TZ/RPM/Aboot OTA是一个通用述语,常见的解释为over the air。通过这一解释,OTA最开始的概念,是空中升级。后来,又衍生出了FOTA&am…

Git使用基础总结(从小白到新手版)

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

BUUCTF [HBNIS2018]excel破解 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。来源: https://github.com/hebtuerror404/CTF_competition_warehouse_2018 密文: 下载附件,得到一个attachment.xls文件。 解题思路&#xff…

ABB机 器 人 操 作 培 训

目 录 1 培训手册介绍 ---------------------------------------------2 2 系统安全与环境保护 ---------------------------------------------3 3 机器人综述 ---------------------------------------------5 4 机器人示教 --------------------------------------------12…

.Net6 Api Swagger配置

1、定义个Swagger版本&#xff08;组&#xff09;的枚举 namespace WebApp.Enums {/// <summary>/// api版本枚举/// </summary>public enum ApiVersion{/// <summary>/// v1版本/// </summary>v1 1,/// <summary>/// v2版本/// </summary&…

Axios 拦截器 请求拦截器 响应拦截器

请求拦截器 相当于一个关卡&#xff0c;如果满足条件就放行请求&#xff0c;不满足就拦截 响应拦截器 在处理结果之前&#xff0c;先对结果进行预处理&#xff0c;比如&#xff1a;对数据进行一下格式化的处理 全局请求拦截器 axios.interceptors.request.use(config > { /…

电脑开机显示器没反应?5个方法轻松解决!

“各位朋友们&#xff0c;我想问问&#xff0c;电脑开机显示器没反应是为啥呢&#xff1f;有什么方法可以解决这个问题吗&#xff1f;感谢感谢&#xff01;” 在使用电脑时&#xff0c;用户可能会遇到各种各样的情况。电脑开机显示器没反应也是一个比较常见的电脑问题。遇到这种…

Springboot+vue的新冠病毒密接者跟踪系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的新冠病毒密接者跟踪系统(有报告)。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的新冠病毒密接者跟踪系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;v…

JSP EL表达式获取list/Map集合与java Bean对象

上文 JSP EL表达式基本使用 中 我们对EL表达式做了一个基本的了解 也做了基础的字符串数据使用 那么 我们可以来看一下我们的集合 首先 list 这个比较简单 我们直接这样写代码 <% page import"java.util.ArrayList" %> <% page import"java.util.Lis…