图片验证码识别的心路历程-概要篇

在进入正题之前,还是先看看几个验证码.


1


2


3


4


5

一般来说,评价一个网站的验证码好坏,有几个方面:

1 字符是否适当扭曲

2  噪点是否明显

3 字库是否庞大

4 字符是否有部分粘贴

其实,每种类型的验证码都有自己的特色,只要对症下药,一般都能药到病除。像上面的几个验证码,1,2,5相对来说,还是有一定难度的。思路参考了https://blog.csdn.net/yinchuandong2/article/details/40340735该文章的论文说明,借鉴了部分代码进行改造。整体流程如下:


处理流程

图片预处理:将图片的颜色转换成黑白色,并将主要的轮廓进行凸显


细化:实际就是对图片中的主干进行瘦身

算法明细说明:

 Rosenfeld细化算法描述如下:

 1. 扫描所有像素,如果像素是北部边界点,且是8simple,但不是孤立点和端点,删除该像素。

 2. 扫描所有像素,如果像素是南部边界点,且是8simple,但不是孤立点和端点,删除该像素。

 3. 扫描所有像素,如果像素是东部边界点,且是8simple,但不是孤立点和端点,删除该像素。

 4. 扫描所有像素,如果像素是西部边界点,且是8simple,但不是孤立点和端点,删除该像素。

 执行完上面4个步骤后,就完成了一次迭代,我们重复执行上面的迭代过程,

 直到图像中再也没有可以删除的点后,退出迭代循环。

cfs算法处理:

CFS连通域分割法。原理就是假定每个字符都由一个单独的连通域组成,换言之就是无粘连,找到一个黑色像素并开始判断,直到所有相连的黑色像素都被遍历标记过后即可判断出这个字符的分割位置。

算法如下:

1 将二值化后的图片进行从左到右、从上到下的遍历,如果遇到黑色像素并且这个像素没有没访问过,就将这个像素入栈并标记为已经访问。

2 如果栈不为空,则继续探测周围8个像素,并执行第2步;如果栈空,则代表探测完了一个字符块。

3 探测结束,这样就确定了若干字符。

drop算法处理:

传统水滴算法


改良后的水滴算法

LIBSVM训练:基于开源的图片特证分类算法,对图片进行归类,建立识别串与特证库的对应关系,能有效提高识别率

目前还存在的一个问题,比如这张图

,就是部分字符切割会存在误切,虽然概率偏小

4的左半部分


4的右半部分

图5的识别结果为:

目前想到的实步方案是,如果分割之后的图片数据大于4张,需要再两两组合之后,选择合适的算法进行处理,再行切分。

你可能感兴趣的:(图片验证码识别的心路历程-概要篇)