得鹿梦鱼 得鹿梦鱼

预处理技术

验证码预处理是指在分割或者直接识别之前对验证码中干扰信息进行剥离的过程,预处理的有效性对分割识别和整体识别都有重要的影响。预处理环节常见的操作有:灰度处理二值化处理去除干扰信息图像去噪

验证码图像表示

为了表述像素之间的相对和绝对位置,通常需要对像素的位置进行约定,约定之后一副验证码图像就可以用一个二维函数 f x, y来表示。其中,坐标x, y的值是离散的,坐标0,0处的值代表原图像左上角的像素值,假设一副图片包括 M 行与 N 列,所有这幅图片便能够用M  N 的矩阵表示出来。

fx,y=[f0,0f0,y1fx1,0fx,y]fx,y = \begin{bmatrix}f0,0& \cdots & f0, y-1 \\\vdots& \ddots & \vdots& \\fx-1, 0& \cdots & fx,y \\\end{bmatrix}

彩色图像灰度化

图像灰度化是将含有亮度和色彩的彩色图像转变为灰度图像的过程,一幅彩色图像通常是由R(红)、G(绿)、B(蓝)三个基本的单色通道组成,有的图像可能还包含有A通道,。灰度化的过程就是将图像从RGB空间转化为YUV空间,Y代表亮度,U、V代表色差,假设不包括U与V分量但仅含有Y信道分量

图像处理算法基本都使用灰度图像作为原始处理图像,所以验证码图片往往需要转化为灰度图, 其中灰度化处理主要有三种方法:平均值法、最大值法以及加权平均值法。

背景色去除:某些图片具有特定的背景色彩,且背景色像素点具有相同的RGB 组合,如这些背景色干扰了预处理,可首先去掉背景色点。背景色点的数量一般是图中最多的,因此统计图中最多的一种RGB 组合,然后把它们改为白色。

灰度阈值精细调节:很多验证码图片看似背景复杂噪点众多,但其主体字符灰度值固定在某狭小区间,且与其他部分灰度值不重合,这是重大设计缺陷。只需对二值转换的灰度阈值进行扩展,改为灰度区间,该区间的像素点设为黑色,其余为白,且保证该区间刚好覆盖住主体字符的灰度值,则可一步去掉各种噪点。

  • 最大值法:灰度值等于RGB 三个分量中数值最大的一个,这个值就是灰度值,即:R=G=B=maxR,G,B\maxR,G,B,灰度值最大使灰度图很亮
  • 平均值法:通过对RGB 三个分量进行求平均,即:R=G=B=R+G+B3\frac{R+G+B}{3},形成的灰度图像较为柔和。
  • 加权平均值法:对RGB 三个分量进行赋权值,求RGB 的加权平均值,即为该点灰度:R = G = B = WR×R+WG×G+WB×BW_R \times R + W_G \times G +W_B \times B;

研究表明人眼对不同颜色的敏感度各有不同,有的颜色敏感度强,有的颜色弱,根据网络历史实验推导证明下式是最合理的灰度图像
WR=0.587,WG=0.229,WB=0.114W_R = 0.587, W_G = 0.229, W_B = 0.114

效果对比:

原图最大值法平均值法加权平均值法
原图最大值法平均值法加权平均值法

图像的二值化

图像二值化的意思就是指通过设定阈值,使大于阈值的像素为一个值,小于阈值的为另一个值,使图像转变为二值图像。经过二值处理,图像中大于阈值的像素点设为255,图像中小于阈值的为0,图像中只保留了0 和255 这两个值,使得处理不再复杂,而且数据的处理量也小了很多

Fi,j={255fi,jT0fi,j<TFi,j = \begin{cases}255 \quad \text{当} fi,j \geq T \\0 \quad \text{当} fi,j \lt T \\\end{cases}

  • 全局阈值法:对图像进行二值化的过程中只使用一个阈值的方法就成为全局阈值法。通过创建灰度图像的直方图,首先对像素点的灰度进行分级,统计同一灰度级点的个数,画出相应直方图,图中的各个峰代表着不同的信息阶。继而根据某一准则,根据某一判别式,进行阈值的计算,最优化得到的信息。

p-分位数法: 使目标或背景的像素比例等于其先验概率来设定阈值;我们先统计出图像中各灰度等级象素出现的总次数,接着得到对应的概率,找到一个合适的阈值,使得小于该阈值的象素数大于或等于先验概率。
Otsu(大津法):最大类间方差法,该方法的推导基于最小二乘法原理,基本思想是设定某一阈值把直方图分割成两组,一组应前边字符信息部分,一组对应于背景干扰噪声部分,当这两个被分割的组,阈值在组间方差最大,组内方差最小时确定
一种基于直方图的图像二值化的算法

  • 局部阈值法

灰度差直方图法
微分直方图法

  • 动态阈值法: 动态阈值法是指阈值的选择和该像素的阈值有关,和该像素的坐标位置有关,和该像素周围的像素的灰度值有关

在本文中图像二值化获取阈值采用全局阈值法中的Otsu(大津法)

虽然p分位数法计算量最少, 其算法也比较简单,但是分位数的值需要人为去进行设定,并不能够去自适应进行处理。CAPTCHA验证码中的字符大小都不相同,并且每次刷新验证码都随机显示字符由于随机显示,每个字符的出现概率也不相同,所以这种方法也就没有任何意义
迭代法对于直方图中有多个波峰的情况,能够找到最优的阈值,与最大类间方差法类似,这种方法也有很好的适应性。但是对于迭代法的初值选择需要注意,如果初值选择比较合适,则迭代 次数较少,当初值的选择不够合理的时候,就可能出现失败的情况,而且γ\gamma的取值需要一定的经验判断,不适合本文,
使用局部阈值法进行验证码图像二值化时,由于图像中字符随机分布,没有固定的模式,而且字符区域在图像中只占图像很少的一部分,通过使用这一方法处理图像,可以造成背景信息保留过多的情况。

如果直接使用ostu+加权平均值法进行图片二值化,效果比较差,如下图示,还需要再计算阈值时对数据进行二次处理

示例:
原图
原图

加权平均值法灰度图

灰度图直方图二值化图
灰度图直方图二值化图

平均值法灰度图

灰度图直方图二值化图
灰度图直方图二值化图

最大值法灰度图

灰度图直方图二值化图
灰度图直方图二值化图

图像去噪

提升验证码识别难度最基本的做法便是在验证码图片中添加干扰信息,设计者通过在验证码中添加干扰信息来模糊和扰乱特征信息。根据验证码干扰信息的不同特征可分为复杂背景类干扰信息、噪声类干扰信息和曲线类干扰信息

  • 复杂背景类干扰信息

复杂背景干扰是在验证码的文本信息之下加入复杂的图片作为背景来干扰特征信息,。验证码的设计规范规定“在提高安全性的同时,必须保证人类可有效识别”。所以文本信息和干扰背景之间必然存在差异,这便给去除背景干扰算法提供了理论基础。对于此类干扰信息传统的去除方法有分水岭算法和基于K-means聚类的彩色分割算法

  • 噪声类干扰信息

在验证码中加入噪声来干扰分割和识别过程,也是一种常见的安全策略,验证码中常出现的噪声干扰包括高斯噪声,椒盐噪声两种,对于此类噪声的去除有两种方案:一是通过特定的滤波对原图进行过滤来去除噪声信息;二是通过连通域算法来遍历所有的连通块,认为较大的连通块是文本信息,较小的连通块为干扰信息

  • 曲线类干扰信息

在验证码中添加一条或多条干扰曲线也是最常见的干扰方式之一,通过横穿字符的干扰线可以让以连通域算法为基础的去噪和分割算法失效

二值图像通常是对灰度图像分割产生的,如果初始的分割不能够达到预定的目标,那么就需要对二值图像进行后面部分的处理,也就是数学形态学图像处理。集合论形态学图像处理的数学基础和所用的语言,最常见的数学形态学基本运算有腐蚀、膨胀、开运算、闭运算、击中、细化和粗化

腐蚀和膨胀

膨胀运算和腐蚀运算时形态学处理的基础。腐蚀运算表示采用某种形状的结构元素或者基元进行探测,从中在图像内部找出一个区域可以放下该元素的区域。实际上膨胀和腐蚀互为对偶运算,因此可以将对图像的补集定义为腐蚀运算

腐蚀的功能是清除掉物体边界点和突出部位,以使得边界向内部收缩,这样可以去掉小于结构元素的物体腐蚀,选取不同大小的结构元素之后,便可以去除不同大小的物体。因此如果两个物体比如字符之间有细小的连接,可以通过腐蚀运算把两个字符分开

开运算和闭运算

开运算即对原图像先去腐蚀,随着对它的结果去膨胀。闭运算就是对图像先进行膨胀,再腐蚀其结果

中值滤波: 中值滤波即设计一个在图像中可以移动的窗口,然后使用排序算法对窗口中包含的像素点的灰度值进行排序,得到排序之后的灰度值序列,选择这些灰度值序列的中间值,将这个中间值赋给窗口中心像素。中值滤波的原理以33 的窗口为例进行说明:将像素区域中对应像素值与滑动窗口系数进行相乘,对这些相乘后得到的九个值进行排序,得到排序后的像素值序列,选取序列的中间值即第五个值,用第五个值将中心像素原值替换掉。扫描的过程以像素为单位进行从左到右,从上到下,扫描每一个点。在实际应用中,我们使用的滑动窗口大小都不能为偶数,如139,11*11 等等,我们经常选择1 来作为我们的滑动窗口系数。下式表达了中值滤波处理过程
yij=med{xij}y_{ij} = med\{x_{ij}\}

其中i 表示滑动窗口行的大小,j 表示滑动窗口的列的大小。xijx_{ij}表示像素区域的像素灰度值,yijy_{ij} 表示对窗口中所有像素排序后得到灰度中间
值。

均值滤波:相对于中值滤波的不一样的地方是,均值滤波是指给目标像素一个包含其周围的临近像素的模板(比如以5*5 滑动窗口为例,以目标象素为中心的周围24 个像素,即去掉目标像素本身,构成了一个滤波模板,),再计算模板中全体像素的平均值,然后使用平均值来代替目标像素原值。均值滤波也叫做线性滤波,邻域平均法是其主要使用的方法。其基本原理就是使用均值替换原始图像中的各个像素点,对像素点(x,y),该点为待处理像素点,选取一个窗口,窗口包含了(x,y)的邻近像素点对窗口中所有像素点进行求平均值,用求得的平均值代替(x y )的值就得到了该点处理后的灰度值gx,ygx,ygx,y=1/fx,ygx,y=1/\sum fx,ym 为该模板中包含当前像素在内的像素 点的总个数

在代码实现中使用加权平均值法+Otsu+中值滤波对图片进行灰度化和去噪噪声处理
在使用Otsu获取阈值的过程中,存在峰值(背景色),以及验证码的前提是让人识别,因此对峰值灰度在一定的偏移内左右4个灰度级别进行归零处理,已减少极值的对获取的阈值的影响

原图噪声处理前的图片噪声处理后的图片裁切字符图片1裁切字符图片2裁切字符图片3裁切字符图片4
原图噪声处理前的图片噪声处理后的图片裁切字符图片1裁切字符图片2裁切字符图片3裁切字符图片4