首页 > 其他分享 >OpenCV和Tesseract OCR识别复杂验证码喽~~

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

时间:2024-09-15 14:21:24浏览次数:11  
标签:字符 OCR Tesseract cv2 验证码 轮廓 OpenCV 图像 识别

目录

代码实现思路

流程:

主要流程:

整体代码

效果展示

原图

处理之后的图

总结

流程图


代码实现思路

使用 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()

 

效果展示

原图

处理之后的图

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


总结

流程图

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

 

标签:字符,OCR,Tesseract,cv2,验证码,轮廓,OpenCV,图像,识别
From: https://blog.csdn.net/DDDDWJDDDD/article/details/142283750

相关文章

  • OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述将一个图像添加到累积图像中。该函数将src或其部分元素添加到dst中:dst(......
  • 新电脑安装和配置pytorch、anaconda、CUDA、cuDNN、pycharm、OpenCV的过程记录
    显卡驱动和CUDA一、升级显卡驱动到官方最新版    1、打开英伟达官网,输入显卡芯片型号,手动搜索并下载显卡驱动。 NVIDIA官方驱动 ​    2、下载完成后安装驱动。 二、确认显卡支持的最高CUDA版本    1、键盘"win+R",调出运行输入cmd后点”......
  • OpenCV(cv::split())
    目录1.函数定义2.工作原理3.示例4.使用场景5.注意事项cv::split()是OpenCV提供的一个函数,用于将多通道图像分割成其各个单通道。该函数主要用于处理彩色图像和多通道矩阵,通常用于对图像中的每个颜色通道单独进行处理。1.函数定义voidcv::split(constMat&src,s......
  • OpenCV添加中文文字
    代码如下,随机在摄像头中添加文字importcv2importnumpyasnpfromrandomimportrandintfromPILimportImage,ImageDraw,ImageFontCOLOR=(255,0,0)font_size=24cap=cv2.VideoCapture(0)whilecap.isOpened():ret,frame=cap.read()width,height......
  • OpenCV(cv::dilate())
    目录1.函数定义2.工作原理3.示例4.应用场景5.膨胀和腐蚀的对比总结cv::dilate()是OpenCV中用于图像形态学变换的函数之一,与cv::erode()相对,它执行图像的膨胀操作。膨胀是一种将图像中的前景(白色区域)扩展的操作,通常用于填补图像中的小孔洞、连接分离的物体、或增强图......
  • OpenCV(cv::erode())
    目录1.函数定义2.工作原理3.示例4.应用场景总结cv::erode()是OpenCV中的图像形态学变换函数之一,用于执行图像的腐蚀操作。腐蚀是一种将图像中的白色区域缩小的操作,通常用于去除噪声、分离相邻的物体,或将小的图像细节消除。1.函数定义voidcv::erode(InputArraysrc......
  • OpenCV(cv::GaussianBlur())
    目录1.函数定义2.高斯模糊原理2.1高斯核\((3\times3)\)2.1.1高斯核的创建2.1.2卷积操作2.1.3边界处理2.1.4完成模糊处理2.1.5总结2.2高斯核\((5\times5)\)3.示例4.高斯核的生成5.高斯模糊的应用场景6.高斯模糊与其他模糊方式的对比7.总结cv::GaussianBlur()......
  • opencv-python学习笔记9-图像分割
    目录一、图像分割的概述、技术现状、应用:技术现状:传统图像分割技术:深度学习驱动的图像分割技术:应用领域:二、 图像分割的方法和分类:(1)基于阈值的分割方法:(2)基于区域的分割方法:(3)基于边缘的分割方法:(4)基于特定理论的分割方法:(5)基于深度学习的分割方法:三、图像分割的原理:......
  • opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四,描述符的匹配筛选五,根据匹配结果映射图片六,整体代码:七,效果:前言在数字化时代,图像处理技术的应用日益广泛,其中表盘校正作为一项重要......
  • ubuntu20.04源码安装支持cuda的opencv4.5.5,显卡Geforce RTX4090
    ubuntu20.04源码安装支持cuda的opencv4.5.5,显卡GeforceRTX4090参考了这位博主的内容:https://blog.csdn.net/u013454780/article/details/128357962sudoapt-getupdatesudoapt-getupgrade安装依赖//安装前的必备包sudoapt-getinstallbuild-essentialsudoap......