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

news2024/9/20 12:20:46

目录

代码实现思路

流程:

主要流程:

整体代码

效果展示

原图

处理之后的图

总结

流程图


代码实现思路

使用 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.coloradmin.cn/o/2139978.html

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

相关文章

人工免疫算法(AIS算法)求解实例---旅行商问题 (TSP)

目录 一、采用AIS求解 TSP二、 旅行商问题2.1 实际例子:求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏(后续和其他算法进行对比) 三、 如何修改代码?3.1 减少城市坐标,如下&a…

【AIGC cosplay】让大模型扮演求职者,我当hr来面试

【AIGC cosplay】让大模型扮演求职者,我当hr来面试 背景前摇(省流可不看): 工位附近有几位人力资源的老师,我发现他们这个职位可以看到好多别人的简历,还能跟好多人聊天,完事了跟同事悄悄吐槽…

<<编码>> 第 12 章 二进制加法器--8位加法器 示例电路

8 位加法器内部结构 info::操作说明 鼠标单击逻辑输入切换 0|1 状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch12-08-8-bit-adder-internal.txt 8 位加法器 info::操作说…

操作系统——OS概述

操作系统——OS概述 操作系统概念 操作系统(Operation System,OS)是管理计算机硬件与软件资源的计算机程序。由此来看,OS是一种特殊的软件,它给用户和其他软件提供接口和环境,是计算机系统中最基本的系统…

20、Cereal

难度 高 目标 root 权限 2 Flag 使用VMware进行运行 信息收集 kali 192.168.152.56 靶机 192.168.152.65 第一次遇到这么快的端口扫描 可以看到存在ftp anoymous访问 同时还有大量的tcpwrapped状态,这个状态我还没见过 另外有个数据库和两个我网站服务&#xf…

4.TensorBoard的使用(一)--add_scalar()

Tensorboard的使用(一) TensorBoard 是一个可视化工具,用于监控和调试深度学习模型的训练过程。 1.使用add_scalar()进行简单绘图 首先需要导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的…

深入理解SpringBoot(一)----SpringBoot的启动流程分析

1、SpringApplication 对象实例化 SpringApplication 文件 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {// 传递的source其实就是类Bootstrapreturn new SpringApplication(sources).run(args);// 实例化一个SpringApplication对象执…

CSS—4

1.定位 1.相对定位 2.绝对定位 3.固定定位 4.粘性定位 5.定位的特殊应用 2.布局-版心 3.布局-常用布局名词 4.布局-重置默认样式

【云原生监控】Prometheus监控系统

Prometheus监控系统 文章目录 Prometheus监控系统资源列表基础环境一、部署Prometheus服务1.1、解压1.2、配置systemctl启动1.3、监听端口1.4、访问Prometheus仪表盘 二、部署Node-Exporter2.1、解压2.2、配置systemctl启动2.3、监听端口2.4、访问node-exporter仪表盘 三、配置…

Java接口的艺术:探索接口特性与面向接口编程

在Java的世界里,接口(Interface)是一种强大的抽象机制,它定义了一组方法规范,但不实现这些方法。接口在Java编程中扮演着至关重要的角色,特别是在实现多态和面向接口编程(Interface-Oriented Pr…

Linux进程状态进程优先级

目录 一、操作系统的进程状态 1.1运行状态 1.2阻塞状态 1.3挂起 二、Linux下具体的状态 三、进程的优先级 3.1基本概念 3.2查看进程优先级的命令 3.3修改进程优先级的命令 3.4其他概念 3.5并发 一、操作系统的进程状态 1.1运行状态 当一个进程准备就绪&#xff0c…

MouseArea元素

常用信号 onClicked,鼠标点击onPressed,鼠标按下onReleased,鼠标释放 import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle{id:rectwidth: 100height: 100color:"red"MouseA…

redis基本数据结构-sorted set

1. sorted set的简单介绍 参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A Redis的Sorted Set(有序集合)是一种数据结构,它是一个不重复的字符串集合,每个元素都有一个对应的分数(score&…

模板方法模式:设计模式中的骨架法则

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 一,模板方法模式的…

C# HttpListener 实现的HTTP Sever浏览器文件下载

1. 前端页面请求 编写简单的test.html 文件&#xff0c;body体值配置a标签&#xff0c;其href 属性设置为文件下载请求的http接口要求的参数序列。 <!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" …

行业分析---自动驾驶行业的发展

1 背景 进入21世纪以来&#xff0c;自动驾驶行业有着飞速的发展&#xff0c;L2级别的自动驾驶技术也逐渐落地量产到寻常百姓家。不管是起步比较早的特斯拉&#xff0c;还是2015年以后国内的公司&#xff0c;都在逐渐发展自动驾驶技术&#xff0c;并量产给用户使用。 自动驾驶最…

COMDEL电源维修CLX2500康戴尔射频电源维修

美国COMDEL射频电源维修常见型号包括&#xff1a;CLX2750&#xff1b;CLX2500&#xff1b;CLX-600H&#xff1b;CX600AS&#xff1b;CX-5000S&#xff1b;CX-3500S&#xff1b;CX-2500S&#xff1b;CV500&#xff1b;CDX2000等。 Comdel成立于1966年&#xff0c;总部设在马萨诸…

Linux环境基础开发工具使用(gcc/g++与makefile)

1.Linux编译器-gcc/g使用 1. 背景知识 接下来的操作&#xff0c;我以gcc为例&#xff0c;因为两者选项都是通用的&#xff0c;所以也就相当于间接学习了 1.预处理&#xff08;进行宏替换) 2.编译&#xff08;生成汇编) 3.汇编&#xff08;生成机器可识别代码&#xff09;…

革新骨科金属螺丝:TPMS结构助力骨再生研究新突破AbMole

在骨科植入物领域&#xff0c;金属螺丝因其出色的机械强度和生物相容性&#xff0c;一直是骨折固定不可或缺的工具。然而&#xff0c;传统实心设计的金属螺丝常常面临应力遮挡和术后松动的问题&#xff0c;严重影响其长期固定效果。近期&#xff0c;一项由吉林大学第二医院骨科…

第T1周:Tensorflow实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框架&#xff1a…