10.x 识别图片验证码
图像验证码的识别很类似OCR,不过验证码的功能就是防止机器人暴力破解,因此相比于OCR,图片上的干扰因素要多的多。因此如果直接读取图片的特征值进行训练,这样正确率会非常低。
1. 常见的验证码干扰
- 首先是噪点,就是验证码图片种有很多‘多余’的点,比如下面这张:
其次是字符的倾斜,验证码会有不同程度的旋转、扭曲,使得在识别的时候不易破解。
再次就是字符的粘连,大多数破解思路就是将图片上的验证码分割为一个个单独的字符然后进行识别,因此如果验证码种的字符粘连程度很高的时候,这样算法最后分割得到的单个字符就会与目标差别很大,影响正确率。 字符的扭曲和粘连比如 12306 的新验证码,这个验证码的破解难度已经很大了,即使票很多,但许多抢票软件依然不能保证抢到票。
接下来就是干扰线,很多验证码会用一条线从左到右贯穿验证码字符,这样做的目的也是使得验证码的字符连城一个整体,防止通过像素来将每个字符孤立出来,QQ的验证码几乎都有干扰线,比如:
- 当然,还有很多有特点的验证码,比如知乎的倒立——汉字,百度贴吧发帖的词语等,这里暂时先不讨论。
2. 识别主要过程:
验证码识别的主要分为两步:图片预处理和图像识别。具体步骤如下:
图像灰度化、二值化,这一步主要为了后面处理的方便,将图片中每个点的像素值只设为两种,要么为255要么为0,一种表示信息元素,一种表示背景。但是如果验证码是彩色的,而干扰因素比如噪点和干扰线可以通过颜色过滤,那么在灰度化、二值化之前还是需要先过滤掉干扰信息,具体情况具体分析,没有一个固定的顺序。
图像降噪点,去除干扰线。主要通过一些滤波算法、降噪算法将验证码图片的干扰因素去掉。
接下来就是字符分割,将图片上的字符分为单个的字符。
字符归一化 ,将被旋转倾斜的字符恢复为正常的角度,并且将单个字符的图片经过缩放归一位固定大小(比如16*16)。
特征值提取,将归一后的字符图片,按照一定的算法,得到一组若干个特征值。
训练,将一定规模的标记号的字符经过图片预处理后得到的特征值与其对应的字符内容,选择特定算法进行训练,得到训练模板。
测试,再取若干分类好的数据,得到特征值然后用相关算法进行预测,得到的字符与自身的字符进行比对,得到准确率。