得鹿梦鱼 得鹿梦鱼

字符提取技术

传统的验证码识别方法需要用到字符分割,对于二值化之后的验证码图像,颜色只有黑白两种。需要将单个字符从验证码图像中切割出来,形成单个字符的点阵图像,以便对验证码图像做进一步的处理,这个字符分割包括两个步骤字符区域确定和将字符分割成单个字符。

切割优化控制:切割失败指自动切分出的字符数不等于实际字符数,通常是2种情况,噪点聚合块被当作字符或者2个字符紧靠成一个字符。对前者,可计算切分出来的每个矩形区域的面积,而最小的面积通常为噪点块,将其去掉。对后者,也可通过计算每个矩形区域的面积或计算区域所占X 轴宽度,而最大的通常为合二为一的字符体,在该区域进行一次均分。

平均切分

所谓平均切分就是指对含几个字符的验证码进行分割几份,每一字符占几分之一宽度,对于字符大小相等,粘连程度较低的验证码有较好的效果,但是该分割方法容易将字符切断,丢失部分文字信息

原图灰度图裁剪图可选切分1切分2切分3切分4切分5
原图灰度图裁剪图切分1切分2切分3切分4切分5

顺直投影切分

对于不粘连且不重叠的验证码常用投影法对验证码进行字符提取,验证码图像进行二值化以后,对每一列图像一像素点为单位进行扫描,当这一个点的值为背景色时,计数器加一,这一列扫描结束就得到了本列为背景色的点的个数,这一个数就可以被投影到投影图中,继续对剩下的列进行扫描,就可以得到所有列的为背景色的点的个数,扫描完成后,我们就可以对扫描的结果进行竖直投影,便得到了竖直投影直方图。。直方图中波谷值为零的点即为两个字符的间隔点,预统计验证码中字符的长度,对于直方图中较长未含有0 点的区块按照预统计的字符长度计算出字符个数。按字符个数进行等分,然后把每个等分点左右三分之一领域内极小值点定为两个字符的间隔点,最后按照所有的间隔点进行垂直分割

原图灰度图裁剪图可选直方图切分1切分2切分3
原图灰度图裁剪图直方图切分1切分2切分3

由上图可以看出,对二值化图像投影得到竖直投影图后 ,投影 字符形成了若干很明显的波峰和波谷,而且字符间的空白处垂直投影为 0 这个 0 的位置就是字符分隔的位置 ,但是如果字符间有简单的粘连或者干扰线存在,不存在投影值为零的情况,就要取波谷最大的那一点作为分割点。本文中采用波谷小于等于5为分割点

虽然投影方法实现起来比较简单,但是通用性比较差,例如:当字符粘连比较严重,强行使用垂直投影的话会 对字符完整性造成一定的影响 对下一步的处理产生比较大的困难与影响 ;当字符 旋转 角度比较大,字符粘连度比较高的时候,如果进行垂 直投影的话,将不好确定分割点;当字符比干扰线还细的时候,垂直投影容易将字符切开而保留干扰线,适得其反。

总的说来,竖直投影的方法对与很多粘连很大的情况,或者背景比较复杂的情况,不能得到很好的效果,但是对于图像比较清晰且粘连较少甚至没有的图像,可以达到较好的处理效果 。但如果图像中有部分干扰线未能在前期处理干净,而投影分割无法对这些干扰线进行处理,导致程序出错。

CFS颜色填充

为了使没有粘连的字符先分割出来,可以选择使用颜色填充的方法进行分割Color Filling Segmentation, CFS 该方法成功地解决了旋转字符分割的问题,可以从一定程度上消减了预处理效果不好的负面影响 。 通过分析研究字符发现笔画的连通性是字符的根本特征 无论字符是否旋转扭曲 任意一笔画都是联通的,不会出现笔画断裂的情况。因为下笔和提笔之间是一个联通域。 依据字符的这一特点,我们认为 Color Filling Segmentation方法可以实现对字符的精确分割。

首先我们对联通域进行定义,本文中我们以八方向联通进行举例说明,还有四方向联通域就不再举例。 一种比较常见的做法是使用递归的算法对联通域进行颜色填充,如下所示

  1. 从左到右,从上到下的扫描图像,标记第一个未被标记的像素点,
  2. 将list队列初始化为空
  3. 对该像素点进行标记,并加入到list队列
  4. 搜索队列头像素点周围的八邻域像素并标记,并加入到一个新的队列newlist
  5. 删除list头元素
  6. 继续对新队列进行操作重复3和4,直到队列为空
  7. 返回第一步

通过以上步骤的处理,我们可以将图片中的连通域准确地找出来,并用不同颜色标记起来,方便后续字符的分割提取。由于噪声干扰以及二值化时可能产生的误差, 必须对连通域进行判断,去除干扰区域,保留字符 区域 ,例如 保留像素数目适当的区域,去除像素数目不合理的区域。 在验证码图片中可能会出现较短的干扰线,这些干扰线比字符小很多,通过颜色填充并判断像素点的个数将这些短小的干扰线可以去掉,很好的解决了投影分割的不足

滴水分割

滴水算法基本思想是模拟水滴从高处向低处滴落的过程来对粘连字符进行分割。在重力作用下,水滴从字符串之间的顶部向下滴落,当水滴遇到字符时只能沿字符轮廓向下滴落或者水平左右滚动。当水滴陷在轮廓的凹陷处时,则进行渗透处理,即从轮廓最低点渗漏到字符笔画中,然后穿透笔画继续滴落,最终水滴所经过的轨迹就是分割路径

常用于分割含有粘连字符或垂直方向有重叠字符的验证码,用水滴流过的痕迹来表示分割的路径。起始位置和滴落规则是影响滴水算法有效性中最重要的两个因素,

起始位置是指水滴开始滴落的位置,也就算法开始计算的位置。滴水算法中每个像素的移动轨迹是由这个像素的两侧和其下方三个像素点的值决定的,如图
滴水分割
w 表示像素值为255,b表示像素值为0,w/b 表示像素值为0 或255,*表示或两者皆可.

起始点的设计

一般来说, 字符的粘连点会出现在竖直投影直方图中的极小值处.

最佳起始点选择

局部扫描模块是指根据分割字符的宽度W,取粘连字符0.2W和0.8W之间为扫描区域,选择这个区域是为了消去粘连字符两端的开始、结尾笔画的影响,即把起始点选择区域集中在粘连字符居中的位置,对区域按找从左到右从上到下的以此扫描像素点,选出最初满足的像素分布的一行,将所有满足条件的白像素点的位置坐标存放在列表中,接着将数值投影法中存在极小值带你的位置按照大小存入列表中,最后参照字符中间位置坐标,选择列表中最右边的白像素点作为最优滴落起始点

通用性优化设计