验证码识别分析

来源:互联网 发布:淘宝规则大全2017最新 编辑:程序博客网 时间:2024/06/15 19:29
       前几天抢火车票,自己抢到后又帮同事抢,抢的真是不亦乐乎,这是一个惊险和恐怖的过程。同时对于很多人来讲这也是一个非常具有时代特征的过程,从大环境来讲,现在春运一票难求,一张票千人抢,但这种情况肯定会逐渐缓解,相信在过几年春运车票会好买很多;同时随着大家收入逐渐增加,大家还可以选择做飞机回家,届时不管车票好买与否,都不会再去抢票了。所以这种抢票经历很具有时代特征,赶紧珍惜每一次抢票吧,哈哈!再说说抢票过程中的惊险和恐怖吧。2011年铁路开始网络售票,对于很多人来说,结束了排着绝望长队买票的历史,开始了电脑前点点鼠标就能通过网络购票的全新体验。在春运这个时间节点,网络购票有什么惊险和恐怖呢?惊险,主要体现在购票过程中验证码填写过程。购票时,用户登录要填一次验证码,预定买票时还要填一次验证码,如果验证码没看清,不小心填写错误,那基本要杯具了,订单提交慢了半拍,票就会被别人抢走了,够惊险吧;恐怖,这两天有新闻报道说有付费抢票软件破解了12306验证码,然后黄牛使用这种软件短时间内就刷走近千张车票,这可是10几节车厢的票,自己也是搞软件的,人肉抢票怎么可能抢的过计算机,你说这恐怖不,当然在这么惊险和恐怖的情况下还能抢到票,那真是太刺激了。上面说的惊险和恐怖都涉及到一个“小东西”,那就是验证码,虽然验证码的概念在脑中形成已久,但一直没有具体看这方面的资料,今天看了几篇验证码识别相关文章,发现这篇文章写的挺清晰,摘录一下。原文链接:http://www.chinasb.org/archives/2013/01/5048.shtml

       1 验证码识别技术
       验证码识别技术属于模式识别的范畴,具体来讲它属于模式识别中的文字识别。验证码识别技术与手写体字符识别技术比较接近,但是一方面验证码比手写体字符多了许多干扰,一方面验证码字符的变化又不如手写体字符丰富,所以它们之间还是有一定的区别。模式识别系统一般具有如图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 识别
       本程序采用最近邻判别法进行识别,即将每个字符的特征向量与标准特征库中的特征向量进行匹配,与哪个字符的匹配最好就判别为哪个字符。具体匹配方法是计算特征向量之间的欧几里德距离,如以下公式所示:

                                                               Length=∑|CurrPara[i]-StdPara[i]|2

       其中CurrPara为待识别字符的特征向量,StdPara为标准模板的特征向量,i=0,1,2,…,24。待识别字符与哪个标准模板的欧几里德距离最小,就表示和哪个模板最匹配,即判别为哪个字符。依次对验证码的各个字符进行识别,即可识别出验证码字符串。本程序还返回了识别结果的可信度reliability。可信度依据验证码的最大最近邻距离计算所得,最大最近邻距离指验证码中各字符最近邻距离的最大值。本程序根据多个阈值对最大最近邻距离进行分段,每个分段返回一个可信度。最大最近邻距离的阈值根据验证码识别情况统计分析所得。Reliability=80表示识别结果80%可信。测试表明Reliability≥80时有很高的可信度。

       2 验证码反识别方法
       结合笔者的研究,提出一些验证码反识别的方法。
       (1)使字符粘连,或加干扰线使字符无法分割,一旦字符无法分割将大大增加识别难度。
       (2)验证码中加入的背景、干扰点、干扰线等要与字符的灰度交错重叠,使程序无法提取出干净的字符。
       (3)验证码中的字符应该采用非标准字体,并使字符随机缩放、旋转、偏移。
       (4)增加字符分类数,增加字符个数,字符个数随机,可以增大识别难度,使程序识别率降低。


注:

欧几里得度量(euclidean metric)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离的就是两点之间的实际距离。


0 0