字符类验证码识别——常用算法及主要流程

作者: 何知晓 | 来源:发表于2016-08-01 16:05 被阅读1597次

    验证码识别相关

    字符类验证码识别主要过程

    1. 去噪
    2. 二值化
    3. 切分
    4. 归一化
    5. 特征提取
    6. 训练模型
    7. 再优化

    字符类验证码基本流程大致就是以上几步,只是针对不同的验证码会选择不同的算法。
    此外需要注意验证码识别流程绝不是固定的,针对不同特征的验证码选择不同的流程才是最好的做法。

    去噪

    去噪可以说是验证码识别中最重要的一环,一旦去噪没做好,最终结果一定是惨不忍睹,相反,若是去噪做好了,整个验证码识别将水到渠成。
    常见去噪方法:

    1. 灰度去噪,即根据噪音与有效信息像素灰度的不同进行去噪,主要针对背景色RGB较大时(即颜色接近白色)使用。
    2. 骨架侵蚀去噪,主要针对细点、细线等噪声去噪,当一个点与周围8个点中若干个点的RGB值相差较大时,认为该点为噪点,进行去噪。需注意此方法会对原有有效信息造成破坏,所以需要谨慎使用。
    3. RGB去噪,主要针对验证码中单个字符颜色极为接近情况下进行去噪,令RGB值差在1~5以内的像素构成一幅图像,有效的字符往往有效信息较多,取有效信息最多的若干幅图片,认为是去噪后的字符。此算法同时完成了去噪、二值化、切分。
    4. 视差去噪,模拟人识别物体的一种算法,即对每一个像素与它周围的8个像素做RGB对比,差别约大则颜色越深,这种算法可以用来识别类似腾讯开放平台的验证码。
    5. 特定问题特定分析,基本上每个网站都有一套自己的验证码生产算法,所以遇到复杂验证码时我们必须进行针对性的分析,找到验证码的弱点,不断挖掘,完成破解。

    二值化

    二值化算法较为有限,基本为灰度二值化与RGB二值化,都是利用颜色的RGB信息进行分类完成黑白两色的转化。

    切分

    针对无粘连字符的切分较为简单,下面主要谈谈针对有粘连字符的切分算法。
    y轴侧视算法:在y轴上观察x轴所有黑色像素点之和,找出若干个大于limit的不连续点,即可认为是切分点。

    归一化

    归一化,即将旋转字符逆旋转化,需要注意的是我们并不需要将字符“摆正”,而是让所有相同字符“正”的角度相同,有以下几种算法:

    1. 宽度最小算法:主要针对数字和字母字符,认为该类字符在摆正的情况下宽度最小,由此完成逆旋转归一。
    2. 横竖侧凸算法:我根据汉字“横平竖直”的特点而发明的一种算法,即认为汉字在摆正的情况下横是平的,竖是直的,所以在x轴和y轴侧视时,若有横或竖,则该列像素中为黑色的数量很大,而上下两列黑色像素的数量较少,如3-15-4,由此让所有行的黑色像素数减去上一行的黑色像素数,取绝对值然后求和,突变最大的即为最“正”的汉字。由此完成逆旋转归一化。此算法对撇捺较多的汉字识别效果不好,但可以通过增加特征值的方式弥补。
      完成逆旋转化后,我们一般会将字符放大或缩小到同一size,方便后续的特征提取等操作。

    特征提取&训练模型

    最简单的方法是对图片取01字符串或二维数组,编辑距离越小则认为其越接近。
    也可以通过深度学习等算法完成训练。
    一般只需要对每个字符可能的结果做1~3次手动分类后,让模型自己进行100次左右分类,找出分类错误的项,针对优化或加入训练集。

    相关文章

      网友评论

        本文标题:字符类验证码识别——常用算法及主要流程

        本文链接:https://www.haomeiwen.com/subject/nioxsttx.html