本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee/
我的验证码识别实践一共有3篇文章。
上一篇《验证码识别实践2》:http://blog.csdn.net/stevenkylelee/article/details/8270069
这是我第三篇验证码识别实践的总结文章。
花了几天时间专门做了这个验证码的识别
验证码地址:
http://pay.m3guo.com/include/KeyCode.aspx
截图:
这个码看起来蛮简单的,人一看就知道了
有人说,如果这个码难识别,
那么一定是难在噪点干扰处理上吧
不尽然,至少对我来说,要处理的问题还有很多
对于做过验证码识别的人来说,
噪点是一方面,还有干扰线。
去噪点有比较多的方法。比如:提取连通分量。
把小于某个指定面积的相连的一块点集合认为是噪点,
涂成背景色。我目前用的就是这种方法
也可以用一个叫:中值滤波 的操作来去除
中值滤波是什么?我初学者不太懂,只知道这个名词
懂的人,欢迎找我交流讨论。:)
仔细观察一下这种验证码。它的特点是:
随机噪点,随机噪点颜色,随机字符位置,
随机字符大小,随机字符颜色,随机干扰线
虽然随机成分比较多。但总体上来说。
随机的范围也不大。比如:随机字符位置
4个字符。每个字符的位置都不会随机得很离谱
所以,可以很轻松地测量到它的随机范围。
为每个字符定义一个ROI,
这个ROI就是字符怎么随机都不会“随”出的范围。
我原先是先简单二值化,然后,为每个字符定义ROI
用这个ROI去取特征,当然,噪点也纳入进去了。
我原以为这样搞一下,应该就可以识别了。
谁知道,训练了几个小时样本。识别率还不到10%。
(每次都有1-3个字符是对的,而4个同时对很少)
后来感觉,可能是噪点很大程度地混淆了特征空间,
所以,怎么训练都不会超过15%的识别率
再改进,用连通分量法,去掉噪点,再训练。
经过了几个小时训练+小修改算法,
识别率最终达到了30%
然后,怎么都上不去了。
30%的识别率效果有点差。
没有办法,得继续想办法处理。
在上面的操作中,我一直没有处理干扰线。
所以,在干扰线存在下,识别率只会在20% - 40%之间。
再仔细观察思考,发现为了使人类能识别出来,
验证码生成的作者,在字符和干扰线上用了不同的颜色。
是不是可以在颜色上做文章呢。。。
想好实现算法后,马上动手开始尝试去除干扰线。
我的方法是:先为每个字符的ROI区域上进行颜色分类
注意,这一步,不是拿二值化后的图像进行操作了
而是需要拿原始彩色图像。
算法的目标是:在一个ROI内,统计出里面的色块种类数
比如:有黄色,红色,蓝色等,每个颜色分成一个种类
如果,黄色和红色之间有过渡色的话,
就把这2个颜色种类合并成一个种类。
最后把颜色种类面积最大的轮廓认为是字符轮廓
这个算法我实现得比较复杂,有差不多300多行
几个小时写了又调试,最终结果如下:
上面一行是原图,下面一行是处理后的图
上图中下面一行的图像是调试图像。
蓝色方框是最小包围框。不用管它
可以看到“横着来的”2条干扰线不见了。哈哈
再经过几个小时训练样本,识别率达到了80%以上!
OK,基本上大功告成了
数数纯用C#写的代码。
这个验证码代码1500行。
有3层类继承层次。(第二层是上一篇文章用的识别器类)
真惊人。
其实,我这个的实现算法,还有很多不足。
基本上理论和第一篇文章说的差不多。
什么N*M特征法。我个人感觉这个特征法不是很好用
比如:在一个字符被干扰线粘合拉长的时候,
整个包围方块就变形了
而中心矩是基于求出质心来计算的,
归一化钜又基于除以面积计算,
所以,可能矩是描述轮廓更好的办法
下次有机会试试矩。
——————————————————————
最后说下除了技术的题外话。
这个验证码我没事绝对不会去研究的,因为很耗费时间。
实验训练样本又是个体力活。
做这个码纯粹是一个这2天来加我的CSDN网友。
他一开始就提出做这个码并且谈价格。
有回报,我当然有动力去尝试了。
第一次做出来30%识别率,他不要,说要到80%以上
最后,做到了80%以上。完全符合了他的要求
他老哥子说一句:“算了,这个不做先了。
我还有事情,Bye,下次我们再合作。”
结果就删掉了我的Q,跑了。
我算是白忙一场。不过,安慰自己
至少我还可以写出这篇总结文章,
长了点经验(不光光是在技术上)
看这个验证码所属的网站的主页:http://pay.m3guo.com/
大概是什么“电魂在线充值系统”
做这个网站的验证码识别有什么经济效益?