OpenCV 数字验证码识别

本文介绍使用OpenCV进行数字验证码识别的方法,包括opencv的安装配置、图像预处理(二值化、中值滤波)、模板匹配和窗口扫描等步骤。适合OpenCV初学者,提供核心代码及下载链接。

更新后代码下载链接在此!!!

点我下载
本文针对OpenCv入门人士,因为我也不是专门做图像的,只是为了完成一次模式识别的小作业。

主要完成的功能就是自动识别图片中的数字,图片包括正常图片,有划痕图像和有噪点图像。分别如下

正常图像

有划痕

有噪点

先上图,看识别效果!

这里写图片描述

接下来开始来点干货了:

  • opencv的安装与配置:这个要是展开讲可以再写一篇博文了,我当时什么都不会配个opencv麻烦死了,最后参考网上studio2012的配置方法成功了,在此略过。看到这里你的opencv还不能用的话,赶紧别往下看了,先把opencv配好再来吧!
  • opencv基本图片操作:
    • 因为opencv有2.0 和 3.0 的版本区别,所以网上搜到的函数或类型都是两种格式,建议用新版的,什么impImage* 类型的都是2.0版本的写法,我全部使用的是Mat。一定要统一好,不要一会新的一会旧的,会报错的。
    • 读图片imread,显示imshow,等待waitKey等等,这些要先熟悉
    • opencv的强大之处在于几乎所有的图像操作它都有现成的函数可供调用,非常方便。多谷歌,一定会有函数已经实现了你想完成的功能。
  • 二值化:不论是原图还是有划痕或噪点的图,背景都不干净,这对识别的影响还是挺不好的,所以要先二值化,把黑白像素点区分的开一些。但是图片右侧明显要比左侧更暗,所以在阈值选取的时候比较难办,很难用一个固定的值将两部分图像都二值化得很理想,所以就用到了逼格更高的自适应二值化(adaptiveThreshold),tips:二值化前先直方图均衡一下效果会更好。
  • 中值滤波:针对有噪点和有划痕的图像,中值滤波是非常好的处理方案,中值的参数可调,可以很好的消除噪音的影响。缺点就是参数不好调啊,调的想死。。
  • 模板匹配:模板的来源可以是自己从待识别的图片中抠图,不过我们作业提供了模板图片,所以这一步就可以省掉了。opencv提供了非常强大的matchTemplate函数,可以将给定图片与模板按照你规定的计算方法计算一个相似度的值,并将对应的坐标存储下来,你需要做的只是将值比较大(或小,与你规定计算相似度的函数有关)的图像框出来即可
  • 窗口扫描:为了提高识别率,我设定了一个窗口对原图进行扫描,扫描窗口的移动设定了一点规则,就是如果前一个窗口没有匹配到数字就微调窗口位置,如果匹配到数字就将窗口左轴移动到匹配到的数字的右侧,再重复扫描。

基本干货就这么多了,剩下的就是不断的调参数和扫描窗口的位置了,这个方法的缺陷就是针对不同的图片,参数和扫描窗都要变,比如来一张一行或三行的数字,那就必须修改扫描窗口的函数了,还有每一步的步长之类的,还是相当蛋疼的!

下面是部分核心代码

预处理,包括自适应二值化和中值滤波

void preProcess(){          //自适应二值化&中值滤波
        Mat out;
        //自适应二值化
        adaptiveThreshold(source, source, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, adaptiveBiSize, adaptiveBiParam); 
        //中值滤波
        namedWindow("binary");
        imshow("binary",source);
        waitKey(0);
        medianBlur( source, out, medianBlurSize);
        namedWindow("medianblur");
        imshow("medianblur
### 使用OpenCV处理或生成数字验证码 #### 处理数字验证码 对于处理数字验证码的任务,可以采用一系列图像处理技术来优化输入给机器学习模型或其他识别算法的数据质量。具体来说,在接收一张带有噪声和其他干扰因素的原始验证码图片之后,可以通过以下步骤对其进行预处理: - **灰度转换**:将彩色图像转化为单通道灰度图像是减少计算复杂性和去除颜色差异影响的有效手段之一[^3]。 ```python import cv2 as cv def convert_to_grayscale(image_path): image = cv.imread(image_path) gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) return gray_image ``` - **高斯滤波降噪**:通过应用高斯平滑滤波器可以在一定程度上去除随机分布的小范围内的像素波动,从而达到降低噪音的目的。 ```python def apply_gaussian_blur(gray_image): blurred_image = cv.GaussianBlur(gray_image, (9, 9), 0) return blurred_image ``` - **自适应阈值二值化**:此过程旨在突出显示目标对象(即验证码中的字符),并将其余部分设为背景色。这里采用了Otsu's Binarization方法自动确定最佳阈值。 ```python def binarize_image(blurred_image): _, binary_image = cv.threshold( blurred_image, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU ) return binary_image ``` - **形态学操作——腐蚀膨胀**:这些操作有助于清理掉一些细小连接点以及填补断开的文字线条之间的间隙,使得后续特征提取更加容易。 ```python import numpy as np def morphological_operations(binary_image): kernel = np.ones((3, 3), dtype=np.uint8) eroded_image = cv.erode(binary_image, kernel) dilated_image = cv.dilate(eroded_image, kernel) return dilated_image ``` 经过上述几个阶段的操作后,最终获得了一张较为清晰、易于解析的黑白二值图像作为下一步分析的基础材料。 #### 生成数字验证码 另一方面,如果目的是创建新的验证码,则可以根据特定需求定制生成逻辑。下面是一个简单例子展示如何利用Python与OpenCV库构建包含随机数字符号组合而成的新颖图形验证字符串[^5]。 ```python from random import choice import string import os def generate_random_string(length=6): characters = string.ascii_uppercase + string.digits captcha_text = ''.join([choice(characters) for _ in range(length)]) return captcha_text def draw_captcha(text, output_folder='captchas'): font_face = cv.FONT_HERSHEY_SIMPLEX scale_factor = 1.5 thickness = 2 # 创建空白白色底板用于绘制文字 width, height = int(70 * len(text)), 100 blank_canvas = 255 * np.ones(shape=[height, width], dtype=np.uint8) text_size, baseline = cv.getTextSize(text, font_face, scale_factor, thickness)[0] org_x = (width - text_size[0]) // 2 org_y = (height + text_size[1]) // 2 colored_canvas = cv.merge([blank_canvas]*3) for i, char in enumerate(text): color = tuple(map(int, np.random.randint(0, 255, size=(3,), dtype=int))) position = ( org_x + sum(cv.getTextSize(c, font_face, scale_factor, thickness)[0][0] for c in text[:i]), org_y ) cv.putText(colored_canvas, str(char), position, font_face, scale_factor, color, thickness) filename = f"{text}.png" filepath = os.path.join(output_folder, filename) if not os.path.exists(output_folder): os.makedirs(output_folder) cv.imwrite(filepath, colored_canvas) if __name__ == '__main__': generated_code = generate_random_string() print(f"Generated CAPTCHA code: {generated_code}") draw_captcha(generated_code) ``` 这段脚本首先定义了一个辅助函数`generate_random_string()`用来生产指定长度由大小写字母加阿拉伯数字构成的一串随机码;接着实现了另一个名为`draw_captcha()`的方法负责接受前述产生的序列参数,并据此渲染出相应视觉效果存入磁盘文件之中。最后主程序调用了这两个功能完成整个流程执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值