首页 > 技术文章 > 粘连字符分割初探~~

soulmate1023 2016-04-06 22:10 原文

  学习验证码快一个星期了,终于把样本集切出来了,现在问题是如何切粘连字符,现在将自己的学习过程记录下来;

  第一部分:

下面很大一部分转自http://drops.wooyun.org/tips/141;感谢原作者。

我们知道,对于不黏连的字符,直接用扫描线分割法就可以,就是看哪一个竖条上没有文字像素,则这个竖条就是两个字符间的空白部分;

当然,对于不黏连的字符,CFS算法效果也很好,它主要是利用连通域进行划分;

还有CFS4D的方法,他只扫描上下左右4个像素来判断是否为种子的连通域;

而CFS则是将他周围的8个像素来判断的。

 

对于每次字符大小和数量都一样的验证码还可以用平均分割法,也就是直接先把中间的文字部分整体切出来,然后按宽度平均分成几份,这种方式对字符粘连比较多用其他方式不好分割的验证码很有用

 

对于有少许粘连但是只是在字符边角的地方重叠几个像素的验证码,可以用垂直像素直方图的统计方法分割。就是对每一个竖条,统计该竖条上出现的像素数(当然,前提要是二值化的图)

还有滴水算法;

 

http://drops.wooyun.org/tips/141

上半部分是垂直像素直方图的一种直观展示,假如图片宽度为100像素,则把图片切割为100个1像素的竖线,下面的红色部分为当前x坐标上所有黑色像素的总和。这么一来可以很容易的通过直方图的波峰波谷把4个字母分割开。图片的下半部分是扫描线分隔法,因为干扰线和字符旋转的存在,只有M和5直接才出现了连续的空白部分。

 

除了垂直像素直方图,还可以从不同的角度进行斜线方向的像素数投影,这种方式对于每次全体字符都随机向一个角度旋转的验证码效果很好。

 

另外对于彩色的验证码,还可以用颜色分割

 

作为验证码识别里的难点,分割字符还有很多种算法,包括笔画分析曲线角度分析等等,不过即便如此,对粘连的比较厉害的字符还是很难成功的

 

还原随机旋转的字符一般采用的是旋转卡壳算法:

 

此算法非常简单,对一张图片左右各旋转30度的范围,每次1度,旋转后用扫描线法判断字符的宽度,对于标准的长方形字体,在完全垂直的时候肯定是宽度最窄的。嗯?纳尼?上面的图是中间的最窄?好像的确是这样,不过只要每次旋转后的结果都一样,对于识别率不会有影响。

扭曲还原的算法比较蛋疼,效果也不怎么样(其实我不会),不过如果识别算法好的话,对扭曲的字符只要人能认出来,识别率也可以达到接近人类的水准。

 第二部分:

    锐化 & 平滑:  图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像锐化技术,使图像的边缘变的清晰。图像锐化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变的清晰。

    

  题外话:

    今天编码的时候有很多细节问题,处理不好,一上手就开始码字,编完一编译才发现很多图片序号问题不对,然后各种修改,原本清晰地代码被改的面目全非,哎,岂是一个心累能表达的,教训:以后编码之前要好好思考一下,细节的处理,最好可以写个大概的框架出来,这样避免很多细节问题恶化,甚至影响整体思路。

推荐阅读