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

文章目录

  • 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.mzph.cn/news/164033.shtml

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

相关文章

Spring Security(安全框架,必须登录成功才能访问指定资源)

一、背景知识 1、Spring Security 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(IOC: 控制反转Inversion of Control ,DI:D…

24路电磁锁控板的特点和主要参数

智能快递柜、智能生鲜柜、电子存储柜、超市寄存柜、智能送餐柜、电子更衣柜、档案柜等物联网终端设备,都是采用电磁锁控制,这种电磁锁控制板俗称锁控板。锁控板可以远程控制储物柜的开关以及远程监控并提供锁的反馈信号。沐渥开发的24路电磁锁控板可以控…

AI:87-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

OpenAI 曾收到 AI 重大突破警告;半独立的 OpenAI 比与微软合并更好丨 RTE 开发者日报 Vol.91

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

ubuntu下docker环境使用GPU配置

本文主要讲述整个命令流程,具体讲解请看官网nvidia-容器工具包和一篇总结得很详细的博文docker使用GPU总结 docker的版本必须安装19.0版本以上的,这里也只讲19.0版本以上的使用方法 首先设置一下网络信息 curl -fsSL https://nvidia.github.io/libnvi…

LeetCode131. Palindrome Partitioning

文章目录 一、题目二、题解 一、题目 Given a string s, partition s such that every substring of the partition is a palindrome . Return all possible palindrome partitioning of s. Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Exa…

工具【1、计算时间差2、获取当天时间前后七天时间3、根据当前数据的位置,在数组中插入数据4、数组中,某个属性相同的数据放在一块,如把某个日期相同的相连一起】

生成UUID /*** 唯一的随机字符串,用来区分每条数据* returns {string}*/ export function getUid() {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, (c) > {const r (Math.random() * 16) | 0;const v c x ? r : (r & 0x3) | 0x8;retu…

【图文详解】SiamFC++与图注意力的强强联合:单目标追踪系统

1.研究背景与意义 随着计算机视觉技术的不断发展,单目标追踪(Single Object Tracking, SOT)作为计算机视觉领域的一个重要研究方向,已经在许多实际应用中得到了广泛的应用。单目标追踪系统可以通过分析视频序列中的目标运动&…

服务器流量包扣减规则

服务器买的流量包,一般指的是上行带宽,下行通常是不限的 上行和下行是针对服务器而言的 客户端上传文件给服务器,对服务器而言它是在下载,所以对服务器而言他是用的下行带宽(下行流量) 客户端从服务器下载文件,对服务器而言它是在上传,所以对服务器而言他是用的上行带宽(上行…

大数据量条件SQL查询内存处理方案以及数据过滤算法优化

MySQL是一个广泛使用的关系型数据库管理系统。通过SQL语言进行数据操作和查询,还支持多用户、多线程和分布式操作等功能。 在实际使用中,我们会遇到各种查询条件,如字段名、表名、逻辑运算符、比较运算符、函数等。其中,有些查询…

浅析智慧社区建设趋势及AI大数据监管平台方案设计

一、背景与需求 伴随着社会与经济的发展,人们对生活质量的要求越来越高,与此同时,新兴技术的进步也促进了智慧社区市场的逐步成熟。智慧社区是社区管理的一种新理念,是新形势下城市与社会管理的一种创新模式。 在上海、杭州、深…

在.bashrc文件修改环境变量的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> ~/.bashrc文件是linux下保存环境变量的系统文件。原以为使用sed命令修改.bashrc文件,实际上不行,需要使用echo命令。具体示例如下…

02-详细介绍Java8新特性方法引用,构造引用,数组引用

方法/构造/数组引用 方法引用 当要传递给Lambda体的操作已经有实现的方法时就可以使用方法引用,方法引用和构造器引用就是为了简化Lambda表达式 方法引用可以看做是Lambda表达式深层次的表达,方法引用本质还是Lambda表达式所以也是函数式接口的一个实例通过方法的名字来指向…

小红书关键词搜索商品列表API接口(分类ID搜索商品数据接口,商品详情接口)演示案例

通过关键词搜索商品API接口,电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词,就可以得到与该关键词相关的商品列表。关键词搜索商品API接口还可以提供给第三方开发者一个便捷的商品搜索服务。开发者可以利用该接口&#xff0…

Mac安装配置typescript及在VSCode上运行ts

一、Mac上安装typescript sudo npm install -g typescript 测试一下:出现Version则证明安装成功 tsc -v 二、在VSCode上运行 新建一个xxx.ts文件,测试能否运行 console.log("helloworld") 运行报错:ts-node: command not…

后渗透持久性-– 服务控制管理器

执行以下命令将快速检索服务控制管理器实用程序的 SDDL 权限。 sc sdshow scmanager服务控制管理器 – 安全描述符 PowerShell 还可用于枚举所有用户组的 SDDL 权限并将其转换为可读格式。 $SD Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Schedule\S…

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 (全真才为真) 或 (一真即为真) 常见条件 双中括号 [[ expression ]] 用法 &…

美国服务器在大陆连不上怎么回事?

​  在租用任何美国服务器之前,都需要先搞清楚一些使用问题,毕竟服务器能够不间断地访问也是站在们所期望的。但有时,美国服务器网站或许也会突然出现在大陆打不开的情况,在面临这种情况时,我们应该怎么做? 查看连不…

【史上最细教程】服务器MySQL数据库完成主从复制

文章目录 MySQL完成主从复制教程准备:原理:步骤: 推荐文章 MySQL完成主从复制教程 主从复制(也称 AB 复制)就是将一个服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从…

Java飞翔的鸟

创建三个包,存放代码。把图片放进文件中 APP包(运行) GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主内容) Barri…