验证码识别---基本流程
Posted CPP开发前沿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码识别---基本流程相关的知识,希望对你有一定的参考价值。
图像验证码的识别很类似OCR,不过验证码的功能就是防止机器人暴力破解,因此相比于OCR,图片上的干扰因素要多的多。因此如果直接读取图片的特征值进行训练,这样正确率会非常低。
常见的验证码干扰有很多种
1. 首先是噪点,就是验证码图片种有很多鼓励的点,有些噪点的颜色各异,比如下面这张:
2. 其次是字符的倾斜,验证码会有不同程度的旋转、扭曲,使得在识别的时候不易破解。
3. 再次就是字符的粘连,大多数破解思路就是将图片上的验证码分割为一个个单独的字符然后进行识别,因此如果验证码种的字符粘连程度很高的时候,这样算法最后分割得到的单个字符就会与目标差别很大,影响正确率。
字符的扭曲和粘连比如12306的新验证码,在我看来12306这个验证码的破解难度已经很大了,不过360的抢票王确实能够破解而且识别率很高,但是360抢票王还是抢不到票,即使票很多。
可以看到,两个字符由于粘连有很大的重叠部分,因此想要分割成单个的字符,还是有比较大的难度。
4. 接下来就是干扰线,很多验证码会用一条线从左到右贯穿验证码字符,这样做的目的也是使得验证码的字符连城一个整体,防止通过像素来将每个字符孤立出来
QQ的验证码几乎都有干扰线,比如:
5. 当然,还有很多有特点的验证码,比如百度贴吧的神兽——汉字,CSDN博客发布时的四则运算等,这里暂时先不讨论。
识别主要过程:
验证码识别的主要分为两步:图片预处理和图像识别。具体步骤如下:
1. 图像灰度化、二值化,这一步主要为了后面处理的方便,将图片中每个点的像素值只设为两种,要么为255要么为0,一种表示信息元素,一种表示背景。但是如果验证码是彩色的,而干扰因素比如噪点和干扰线可以通过颜色过滤,那么在灰度化、二值化之前还是需要先过滤掉干扰信息,具体情况具体分析,没有一个固定的顺序。
2. 图像降噪点,去除干扰线。主要通过一些滤波算法、降噪算法将验证码图片的干扰因素去掉。
3. 接下来就是字符分割,将图片上的字符分为单个的字符
4. 字符归一化 ,将被旋转倾斜的字符恢复为正常的角度,并且将单个字符的图片经过缩放归一位固定大小(比如16*16)
5. 特征值提取,将归一后的字符图片,按照一定的算法,得到一组若干个特征值
6. 训练,将一定规模的标记号的字符经过图片预处理后得到的特征值与其对应的字符内容,选择特定算法进行训练,得到训练模板
7. 测试,再取若干分类好的数据,得到特征值然后用相关算法进行预测,得到的字符与自身的字符进行比对,得到准确率
以上是关于验证码识别---基本流程的主要内容,如果未能解决你的问题,请参考以下文章