1 验证码识别技术
验证码识别技术属于模式识别的范畴,具体来讲它属于模式识别中的文字识别。验证码识别技术与手写体字符识别技术比较接近,但是一方面验证码比手写体字符多了许多干扰,一方面验证码字符的变化又不如手写体字符丰富,所以它们之间还是有一定的区别。模式识别系统一般具有如图1所示结构,主要包括预处理、特征提取、训练和识别几个部分,验证码识别系统也不例外。根据验证码的特点,研究表明验证码识别的难点和重点在于预处理,即去除噪声、干扰和字符分割。
本文以下图所示验证码的识别为例来介绍验证码识别技术。
1.1预处理
预处理是在验证码学习和识别之前对验证码图片进行前期处理,主要包括Jpeg解码、二值化、去除噪声和干扰、字符分割、归一化等。预处理的好坏极大地影响到识别性能,其中去除干扰和字符分割尤为重要。
Jpeg解码 :并非所有验证码的识别都需要进行Jpeg解码,但是本验证码图片为Jpeg格式,只有先经过Jpeg解码才能进行处理。本程序采用GDI++进行Jpeg解码,通过调用相关函数,使Jpeg格式的验证码图片首先转换为bmp格式,暂存于临时文件CodeBmp.bmp中,然后再打开CodeBmp.bmp文件进行处理。Jpeg解码的相关函数调用如下:
gdiplus.ConvertPic(L”image/bmp”, DllDir+”/CodeBmp.bmp”, PicPath); //将jpg格式转换为bmp格式
二值化:二值化是将验证码图片的灰度值,以某一阈值为限,转换为0或255,即黑和白,以便于处理。因为本验证码的字符灰度偏白,所以在进行二值化之前先进行了灰度反置,即让背景变白,让字符变黑。二值化阈值根据具体验证码分析所得,选择合理的阈值可消除很多背景、噪声,同时不损伤字符笔画。本程序的二值化阈值设为120,可以很好的去除背景。
去除噪声和干扰:二值化后大部分噪声都已经去除,但是还有很多干扰线,不去除这些干扰线就不可能进行后续的处理。通过对本验证码干扰线的特点进行分析,发现干扰线很细,比字符笔画细很多,干扰线的高度为1个象素,干扰线相交处的高度一般为2个象素。本程序首先去除了所有高度为1的点线,然后去除了高度为2且与高度为1的象素相通的点线。
字符分割:字符分割即把验证码图片分割成单个的字符,这是有效识别的基础。本程序先利用种子填充算法得到几个连通线,这样未粘连的字符即可分割。对于粘连字符,还需要进一步分割。粘连字符的判别主要依据字符的点数和宽高比特征,大于某一阈值则初步判断为字符粘连。阈值根据验证码特征统计分析所得。对于初步判断为粘连的字符,为了防止判断错误,还用预识别的方法进行了进一步判断,如果能很好地识别也不认为是粘连字符。对于粘连字符的分割,本程序采用在垂直投影图中找谷点的方法进行分割。
归一化:验证码字符存在位置偏移、大小不一、旋转不定的特点,如果不进行归一化就不能很好识别。本程序采用质心对齐和线性插值放大的方法进行归一化,使字符变为统一的规格,以便于进行匹配识别。
1.2特征提取
特征提取是从经过预处理的字符图片中,提取出一定维数的特征向量,这样能提高字符匹配和识别的存储量和运算速度。字符有很多特征,选用合适的特征才能达到正确识别的目的。本程序采用了字符的区域密度的特征,即将字符分为5*5的25个方格区域,计算每个方格中的点数与字符总点数之比,以得到25维特征向量。该特征反映了字符笔画的空间分布情况,并且对字符笔画的粗细不敏感。
1.3 训练
训练是从训练集验证码中提取出标准模板,即标准特征库的过程。本程序采用了1500个验证码进行训练,使每个字符都有200个左右的标准模板。通过预处理和特征提取后,将训练集验证码的特征向量存入文件std.inf中。训练时需要指明各验证码的正确值。为了不出现错误的标准模板,对于分割时发现有字符粘连的训练集验证码不加入模板库。
1.4 识别
本程序采用最近邻判别法进行识别,即将每个字符的特征向量与标准特征库中的特征向量进行匹配,与哪个字符的匹配最好就判别为哪个字符。具体匹配方法是计算特征向量之间的欧几里德距离,如以下公式所示:
其中CurrPara为待识别字符的特征向量,StdPara为标准模板的特征向量,i=0,1,2,…,24。待识别字符与哪个标准模板的欧几里德距离最小,就表示和哪个模板最匹配,即判别为哪个字符。依次对验证码的各个字符进行识别,即可识别出验证码字符串。本程序还返回了识别结果的可信度reliability。可信度依据验证码的最大最近邻距离计算所得,最大最近邻距离指验证码中各字符最近邻距离的最大值。本程序根据多个阈值对最大最近邻距离进行分段,每个分段返回一个可信度。最大最近邻距离的阈值根据验证码识别情况统计分析所得。Reliability=80表示识别结果80%可信。测试表明Reliability≥80时有很高的可信度。
2 验证码反识别方法
结合笔者的研究,提出一些验证码反识别的方法。
(1)使字符粘连,或加干扰线使字符无法分割,一旦字符无法分割将大大增加识别难度。
(2)验证码中加入的背景、干扰点、干扰线等要与字符的灰度交错重叠,使程序无法提取出干净的字符。
(3)验证码中的字符应该采用非标准字体,并使字符随机缩放、旋转、偏移。
(4)增加字符分类数,增加字符个数,字符个数随机,可以增大识别难度,使程序识别率降低。