验证码识别技术(1) - 边缘检测

概述

验证码有时候也叫图形码,是一种阻止软件进行某些自动化行为的技术。被广泛的用于各种系统的帐号注册、登录验证等环节。在一定程度上验证码可以阻止软件自动进行帐号密码猜解、注册等行为。

但迫于一些原因,我们需要自动进行上述被“禁止”的行为,这时就有一个课题摆在我们面前:验证码识别技术,也可以叫做图形识别技术、模式识别技术。

如今的验证码已不再像互联网初期那么单纯,早期的验证码可以通过简单的二维矩阵对比即可得出结果,因为早期的图形码采用固定的字库,并加以简单的处理的后输出,例如随机产生一些噪点,和随机修改字符颜色。

早期的图形码字符排列整齐,字符数量确定,甚至是固定位置,例如第一个字符出现在 X:10 Y:3 第二个字符出现在 X:25 Y:3,字符大小,字符轮廓都一成不变,单色背景,或固定单色前景,对于这些验证码的识别不在本文的讨论范畴内。本文将要讨论的是字符经过扭曲、旋转,字符数量不确定,字符位置不确定,字符大小不确定,并且背景为复杂背景(背景存在多种颜色,甚至渐变色,或是纹理图案)高级验证码识别技术。本文讨论的内容不但可用于网站验证码识别领域,还广泛用于工业、医学,例如车牌识别、OCR印刷文字识别。但重点介绍的还是基于验证码的识别技术。

验证码识别的实现思路

复杂图形码识别的第一步便是图像的定位与切割。其中包括如何把信息部分(包含字符轮廓的部分)从背景中分离,并把字符切开,并把信息部分二值化(只有黑色#000000和白色#FFFFFF)。如果不定位与切割图像,计算量将会是非常庞大,并且识别错误率极大。

对于背景较为简单(单色)的图形码,背景与前景的分离,就会容易做到。单对于背景为多色、渐变色、纹理图片的验证码来说分离背景就显得异常复杂。

这里我们应该考虑人的思维方式,当我们看到这种验证码的时候,肉眼并不是先把背景进行分离,我们首先看懂了其中我们认识的前景轮廓(字符、数字),然后我们把前景移除,我们才发现原来背景是一幅带有纹理的图片。

根据这个思想我们应当略过背景分离,直接寻找前景轮廓。如果我们能够得到前景的轮廓(我们感兴趣的也只是前景部分)就不必再去分离背景。如果验证码背景和前景没有明显的轮廓和反差,哪么别说机器,就算人眼也无法辨识。

于是,我们设定一个合理的“阈值”通过边缘检测算法来把图片轮廓(反差强烈的部分)依次分割出来。但需要注意的是,我们提取出的部分除了包含前景(字符轮廓)还包含了其他零碎的片段,例如背景图片,或背景图片的一部分,或字符“0”中空心的部分。

 


 

边缘检测算法可以用一个词形象的概括,那就是“燃烧”。

1,首先从X:0 Y:0点开始燃烧,把相邻并且在“阈值”限定内的像素“点燃”,并把该像素标记为“已点燃”。

2,从最后一次“点燃”的像素递归过程1,继续点燃“阈值”限定内的其他相邻点。(注意每次递归过程要按照最后一次“点燃”像素和当前像素之间的色差来对比“阈值”,而不能始终以X:0 Y:0点计算“阈值”,这样才能处理渐变的背景色。)

3,当第一轮燃烧(X:0 Y:0)全部熄灭后,第一次边缘检测便完成了,接着,遍历图形,寻找标记为“未点燃”状态的像素,并从此开始重复“燃烧”过程。直到全部像素都被标记为“已点燃”。

不过实际操作中,遍历函数会受到栈大小的限制,在处理过大图片的时候(例如300*300的图片),很可能会因为遍历深度过大引起栈溢出,而让你的程序Down掉,不过可以使用其他方法,例如建立“燃烧任务表”的方法来解决这个问题。其本质还是遍历。

 


 

一般来说我们应当抛弃掉分割后体积超过50%的部分,因为这么大的部分,他只能是背景。分割后体积小于5%的部分也应当抛弃,这可能是背景纹理、或是噪点、干扰线,根据多次的边缘检测学习,我们总能够给出一个合理的值,率除掉大部分无关的分割结果。

经过这些过滤算法,和精确的边缘检测,我们完全可以把分割后的部分填充为单色,以便于后续的识别。但是在真正的识别开始之前我们还需要对这些图像进行一些操作。

1,缩放操作,把待识别图像缩放到指定大小,一个既能保证图像细节不过多丢失,又能尽可能小,以加快识别速度的大小,我这里用的是24*24大小,主要是因为目前的验证字符过于复杂(手写体、镂空)如果过小会丢失太多细节。

2,旋转操作,检测出待识别图像被旋转的角度,并反向旋转,以便识别。

3,图像修复,经过边缘检测算法后,图像可能会有一些受损,例如中部出现镂空点,我们需要经过一定的算法对图像进行修复。

4,粘连、重叠图形检测,再次分割,或掩码识别,针对复杂验证码,这是非常重要的一步,也是业界内普遍遇到的难点。

 

请期待我的下一篇文章:验证码识别技术(2) - 边缘检测后进一步的处理

posted @ 2009-05-25 14:33  庄园  阅读(5258)  评论(6编辑  收藏  举报