验证码识别相关
字符类验证码识别主要过程
- 去噪
- 二值化
- 切分
- 归一化
- 特征提取
- 训练模型
- 再优化
字符类验证码基本流程大致就是以上几步,只是针对不同的验证码会选择不同的算法。
此外需要注意验证码识别流程绝不是固定的,针对不同特征的验证码选择不同的流程才是最好的做法。
去噪
去噪可以说是验证码识别中最重要的一环,一旦去噪没做好,最终结果一定是惨不忍睹,相反,若是去噪做好了,整个验证码识别将水到渠成。
常见去噪方法:
- 灰度去噪,即根据噪音与有效信息像素灰度的不同进行去噪,主要针对背景色RGB较大时(即颜色接近白色)使用。
- 骨架侵蚀去噪,主要针对细点、细线等噪声去噪,当一个点与周围8个点中若干个点的RGB值相差较大时,认为该点为噪点,进行去噪。需注意此方法会对原有有效信息造成破坏,所以需要谨慎使用。
- RGB去噪,主要针对验证码中单个字符颜色极为接近情况下进行去噪,令RGB值差在1~5以内的像素构成一幅图像,有效的字符往往有效信息较多,取有效信息最多的若干幅图片,认为是去噪后的字符。此算法同时完成了去噪、二值化、切分。
- 视差去噪,模拟人识别物体的一种算法,即对每一个像素与它周围的8个像素做RGB对比,差别约大则颜色越深,这种算法可以用来识别类似腾讯开放平台的验证码。
- 特定问题特定分析,基本上每个网站都有一套自己的验证码生产算法,所以遇到复杂验证码时我们必须进行针对性的分析,找到验证码的弱点,不断挖掘,完成破解。
二值化
二值化算法较为有限,基本为灰度二值化与RGB二值化,都是利用颜色的RGB信息进行分类完成黑白两色的转化。
切分
针对无粘连字符的切分较为简单,下面主要谈谈针对有粘连字符的切分算法。
y轴侧视算法:在y轴上观察x轴所有黑色像素点之和,找出若干个大于limit的不连续点,即可认为是切分点。
归一化
归一化,即将旋转字符逆旋转化,需要注意的是我们并不需要将字符“摆正”,而是让所有相同字符“正”的角度相同,有以下几种算法:
- 宽度最小算法:主要针对数字和字母字符,认为该类字符在摆正的情况下宽度最小,由此完成逆旋转归一。
-
横竖侧凸算法:我根据汉字“横平竖直”的特点而发明的一种算法,即认为汉字在摆正的情况下横是平的,竖是直的,所以在x轴和y轴侧视时,若有横或竖,则该列像素中为黑色的数量很大,而上下两列黑色像素的数量较少,如3-15-4,由此让所有行的黑色像素数减去上一行的黑色像素数,取绝对值然后求和,突变最大的即为最“正”的汉字。由此完成逆旋转归一化。此算法对撇捺较多的汉字识别效果不好,但可以通过增加特征值的方式弥补。
完成逆旋转化后,我们一般会将字符放大或缩小到同一size,方便后续的特征提取等操作。
特征提取&训练模型
最简单的方法是对图片取01字符串或二维数组,编辑距离越小则认为其越接近。
也可以通过深度学习等算法完成训练。
一般只需要对每个字符可能的结果做1~3次手动分类后,让模型自己进行100次左右分类,找出分类错误的项,针对优化或加入训练集。