OpenCV和Tesseract OCR识别复杂验证码喽~~

目录

代码实现思路

流程:

主要流程:

整体代码

效果展示

原图

处理之后的图

总结

流程图


代码实现思路

使用 OpenCV 进行图像预处理,并通过 Tesseract OCR 来识别验证码中的字符。以下是其实现思路的详细讲解:

流程:

  1. 加载验证码图像

    • 使用 cv2.imread() 读取验证码图片,将其加载为 BGR 格式图像。
  2. 灰度处理

    • 使用 cv2.cvtColor() 将彩色图像转换为灰度图。灰度图可以减少颜色信息的干扰,更适合后续的二值化处理和降噪。
  3. 高斯模糊

    • cv2.GaussianBlur() 被用来对灰度图像进行模糊处理,以减少图像中的噪声。模糊有助于平滑噪点,让后续的二值化效果更稳定。
  4. 二值化

    • cv2.threshold() 通过设定一个阈值将灰度图转换为二值图像,即只有黑白两色。 THRESH_BINARY_INV 是反向二值化,将前景变为白色,背景变为黑色。这样做是为了更容易找到字符的轮廓。
  5. 形态学操作

    • cv2.morphologyEx() 用来进一步清理图像,通过开运算(先腐蚀后膨胀)去除小的噪声点。这里定义了一个 2x2 的内核(kernel)来执行形态学操作,帮助消除图像中不规则的小黑点。
  6. 查找轮廓

    • cv2.findContours() 查找二值化图像中的轮廓,即可能的字符区域。每个轮廓都表示一个可能的字符边界。
  7. 轮廓排序

    • 通过 cv2.boundingRect() 获取轮廓的外接矩形,并按照从左到右的顺序对这些矩形进行排序。这是为了保证字符按正确顺序被识别。
  8. 轮廓过滤和分割字符

    • 遍历每个轮廓,使用 cv2.boundingRect() 得到每个轮廓的位置信息(x, y, w, h),过滤掉那些宽度过小或高度过小的轮廓(这些可能是噪声)。对于符合条件的轮廓区域,将其切割出来作为单个字符图像。
  9. OCR 识别

    • 使用 Tesseract 的 pytesseract.image_to_string() 来识别单个字符。 --psm 10 是 Tesseract 的配置,表示将图像视为单个字符进行识别。每个字符识别后追加到 recognized_text 中。
  10. 结果输出

  • 打印出识别到的验证码字符。
  1. 显示图像
  • 使用 cv2.imshow() 显示处理后的二值化图像。 cv2.waitKey(0) 等待键盘事件,cv2.destroyAllWindows() 关闭所有窗口。

主要流程:

  • 图像预处理(灰度、模糊、二值化、形态学操作)来去除噪声。
  • 查找轮廓并过滤,将字符区域提取出来。
  • OCR 识别,逐个字符识别并拼接为最终的验证码。



 

整体代码

import cv2
import pytesseract
import numpy as np# 如果你在Windows上使用Tesseract,取消注释并设置Tesseract路径
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'# 加载验证码图像
image = cv2.imread('./img/code.jpg')# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用高斯模糊来去噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 二值化,设定阈值
_, binary = cv2.threshold(blurred, 150, 255, cv2.THRESH_BINARY_INV)# 形态学操作(去除噪声)
kernel = np.ones((2, 2), np.uint8)
cleaned = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)# 在图像上查找轮廓,并尝试将字符分割开
contours, _ = cv2.findContours(cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 对轮廓进行排序(从左到右)
contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])# 逐个轮廓识别字符
recognized_text = ""
for contour in contours:x, y, w, h = cv2.boundingRect(contour)# 过滤太小或太大的区域,避免识别噪声if w > 5 and h > 15:char_img = cleaned[y:y + h, x:x + w]# 调用Tesseract OCR识别单个字符char_text = pytesseract.image_to_string(char_img, config='--psm 10')recognized_text += char_text.strip()# 打印识别结果
print(f"识别出的验证码是: {recognized_text}")# 显示预处理后的图像
cv2.imshow('Processed Image', cleaned)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

效果展示

原图

处理之后的图

        其实处理效果非常的明显,大家只需要在加一个能够排除这种黑色小点的功能几乎就可以完美的实现识别这样及其复杂的验证码结构


总结

流程图

        为什么我没有给出完整的实现方式 ,因为我是真的没有找到一个完美的去处黑色点的方法,所以其实这里识别起来还是有很大的几率让程序识别失败的,所以遗憾还是有的,但是我们至少做了些什么。

 

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

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

相关文章

代码随想录Day 44|leetcode题目:1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一:1143.最长公共子序列解题思路: 题目二: 1035.不相交的线解题思路: 题目三:53. 最大子序和解题思路 题目四:392.判…

【Android 13源码分析】WindowContainer窗口层级-3-实例分析

在安卓源码的设计中,将将屏幕分为了37层,不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析,整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

优化 TCP 以提高网络性能

本页面简要介绍了计算正确设置的方法,以缩短 Google Cloud 和混合场景中 TCP 连接的延迟时间。本页面还可帮助您了解如何缩短 Google Cloud 中流程之间的连接延迟时间。 现代微服务架构主张,开发者应该构建处理单一任务的小型服务。服务应根据系统的可靠…

【iOS】dismiss多级的方法

前言 上次笔者总结过push和pop推入和推出界面的方法,这里对于dismiss多级的方法进行一个总结,推入推出方法可以看看笔者这篇博客:【iOS】UI学习——界面切换 dismiss推出多级的原理 当我们使用pop推入新的界面的时候,连续pop推…

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef 1. AOSPXRef1.1. http://aospxref.com/android-14.0.0_r2/1.2. build/envsetup.sh 2. AndroidXRef2.1. http://androidxref.com/9.0.0_r3/2.2. build/envsetup.sh 3. HELLO AndroidReferences 1. AOSPXRef http://aospx…

YOLOv5/v8 + 双目相机测距

yolov5/v8双目相机测距的代码,需要相机标定 可以训练自己的模型并检测测距,都是python代码 已多次实验,代码无报错。 非常适合做类似的双目课题! 相机用的是汇博视捷的双目相机,具体型号见下图。 用的yolov5是6.1版本的…

QT --- 初识QT

一、通过代码构建helloworld界面 一般通过代码来构造界面的时候,通常会把构造界面的代码放到Widget/MainWindow的构造函数中。 Qt中每个类都有对应同名的头文件 上古时期,Qt用的是这种风格的文件。1998年之后,C标准成立了,C98标准…

jenkins入门

CI 、CD入门 一:jenkins实现CI操作 1.在jenkins环境安装jdk 、maven ,同事修改maven里的settings.xml中的两个配置:添加jdk插件版本并开启和私服镜像(也可以在jenkins页面的全局配置选择自动安装,但是自动安装速度很慢,所以这里选择手动安装,后面直接在全局配置指定目…

太阳下山还有月光,月亮睡了还有朝阳

最近听到一首歌《GooGoo-不要慌太阳下山有月光》,觉得里面的歌词很有意思,这也是标题的由来。截取歌词片段: 不要迷茫 不要慌张 太阳下山 还有月光 它会把人生路照亮 陪你到想去的地方 不要彷徨 不要沮丧 月亮睡了 还有朝阳 抬头看天一定会亮…

如何正确使用MMPI量表进行测试?

1、需要初中以上学历,能对测试题准确的理解。 2、应在安静、无干扰的环境中进行,确保自己能够集中注意力完成测试。 3、尽量不要选择“无法回答”这个选项,当然如果确实有无法回答的,也可以选,但是总数不要超过22个。…

Python计算机视觉 第9章-图像分割

Python计算机视觉 第9章-图像分割 图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。 9.1 图割(Graph Cut) 图割(Graph…

一步一步自制py脚本并且并且修改为exe可执行文件教学外附带SHA-1解密exe文件资源

第一步:安装 Python 下载 Python:访问 Python 官网 下载并安装最新版本的 Python。安装时选择添加到环境变量 PATH:在安装过程中,确保勾选“Add Python to PATH”选项。 第二步:编写 Python 脚本 创建一个新的 Pyth…

基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制

关联比赛: 2021第二届云原生编程挑战赛2:实现一个柔性集群调度机制 参赛心得 历时快两个月的第二届云原生编程挑战赛结束了,作为第一次参赛的萌新,拿下了28名的成绩,与第一名差了19万分,因为赛制时间太长&#xff0c…

基于python+django+vue的社区爱心养老管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

103.WEB渗透测试-信息收集-FOFA语法(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:102.WEB渗透测试-信息收集-FOFA语法(2) FOFA使用实例 组件框架 …

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key,也就是defaultZone不支持snake-c…

cmd命令

常用命令 查看电脑名称: hostname 查看网卡信息: ipconfig 快速打开网络设置界面: control.exe netconnections 或 rundll32.exe shell32.dll,Control_RunDLL ncpa.cpld 打开防火墙设置: wf.msc 指定网卡设置IP地址&#…

Vue:使用v-model绑定的textarea在光标处插入指定文本

一、问题描述 使用v-model绑定的textarea如果需要改变其内容,一般只要改变v-model对应的变量即可,但如果需要在textarea的当前光标位置插入指定文本,那就需要操作DOM了。于是我们写了一段js: const insertTextAtCursor (text) …

基于TCP发送北斗消息给船舶设备终端

文章目录 引言I 自定义动态数据交换协议信息交换接口通信格式消息发送指令状态码错误信息返回指令II Netty实现TCP客户端III Java 原始API实现TCP客户端知识扩展: 基于Netty的定位数据平台通信协议定位方式移动定位设备see also引言 需求:发送北斗消息给船舶设备终端 动态信…