两年前做过验证码识别的东西,这几天因为一个朋友问,索性总结一下。本人技术很差,文笔也很差,全当抛砖引玉,高手请指点,新手一起学习哈。
验证码,形式很多,由最早的噪点,连接线,到背景色‘变换,以至于后来的旋转,扭曲,粘连,方法各异,但是,个人认为,难点主要集中在一点,就是粘连与否。(个人主要卡在这里)。
今天先介绍一下验证码识别的传统思路:灰度(也有直接二值法)、二值、去噪(也可能放到前面)、切割、识别
灰度有一个很著名的心理学公式Gray = R*0.299 + G*0.587 + B*0.114,不过除非你不想过日子,才会用浮点数过日子,给大家提供一个位移法: Gray = (R*19595 + G*38469 + B*7472) >> 16,这个精度不错,速度也很快,个人比较推荐。
二值化这个很重要,一般来说,二值化做得好,后面的去噪都能省很大事,甚至不用去噪了。
去噪要因噪而异,现在算法还是不错的,能看到的噪音,几乎都能去掉,所以,去噪不是什么问题,不需要担心。
切割比较好笑,可以切的,就切了,不可以切的,你也没脾气,一般都是x轴投影,新出来的有外轮廓识别的,有连通线的,大同小异,一般来说,如果粘连了,什么方法都没用。
识别算法很多,学术派喜欢的是神经网络流,其实效果一般,而且,样本越大,导致越慢,不是很推荐,不过好发文献,呵呵。数字类的,比较常用的算法是日字投影,加权法。字母就比较杂了,加权、神经网络、覆盖法等等。近几年有人提出来的形状上下文,这个不错,很推荐。个人在开发一种新的识别方法,专门针对扭曲字母和数字,不过对付粘连还是不强,一直有个目标是google的验证码实现50%的识别,呵呵。
如果粘连,一般来说,或者通过算法分割,或者用形状上下文做整体识别。笔者的粘连识别一直没有超过50%所以不好说什么。
转贴请注明来源,希望和大家交流进步