验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线

时间:2023-02-03 07:46:06

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee/


我的验证码识别实践一共有3篇文章。

上一篇《验证码识别实践2》:http://blog.csdn.net/stevenkylelee/article/details/8270069


这是我第三篇验证码识别实践的总结文章。


花了几天时间专门做了这个验证码的识别

验证码地址:

http://pay.m3guo.com/include/KeyCode.aspx

截图:

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线 验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线


这个码看起来蛮简单的,人一看就知道了

有人说,如果这个码难识别,

那么一定是难在噪点干扰处理上吧

不尽然,至少对我来说,要处理的问题还有很多

对于做过验证码识别的人来说,

噪点是一方面,还有干扰线。


去噪点有比较多的方法。比如:提取连通分量。

把小于某个指定面积的相连的一块点集合认为是噪点,

涂成背景色。我目前用的就是这种方法

也可以用一个叫:中值滤波 的操作来去除

中值滤波是什么?我初学者不太懂,只知道这个名词

懂的人,欢迎找我交流讨论。:)


仔细观察一下这种验证码。它的特点是:

随机噪点,随机噪点颜色,随机字符位置,

随机字符大小,随机字符颜色,随机干扰线


虽然随机成分比较多。但总体上来说。

随机的范围也不大。比如:随机字符位置

4个字符。每个字符的位置都不会随机得很离谱

所以,可以很轻松地测量到它的随机范围。

为每个字符定义一个ROI,

这个ROI就是字符怎么随机都不会“随”出的范围。


我原先是先简单二值化,然后,为每个字符定义ROI

用这个ROI去取特征,当然,噪点也纳入进去了。

我原以为这样搞一下,应该就可以识别了。

谁知道,训练了几个小时样本。识别率还不到10%。

(每次都有1-3个字符是对的,而4个同时对很少)

后来感觉,可能是噪点很大程度地混淆了特征空间,

所以,怎么训练都不会超过15%的识别率

再改进,用连通分量法,去掉噪点,再训练。

经过了几个小时训练+小修改算法,

识别率最终达到了30%

然后,怎么都上不去了。


30%的识别率效果有点差。

没有办法,得继续想办法处理。

在上面的操作中,我一直没有处理干扰线。

所以,在干扰线存在下,识别率只会在20% - 40%之间。

再仔细观察思考,发现为了使人类能识别出来,

验证码生成的作者,在字符和干扰线上用了不同的颜色。

是不是可以在颜色上做文章呢。。。


想好实现算法后,马上动手开始尝试去除干扰线。

我的方法是:先为每个字符的ROI区域上进行颜色分类

注意,这一步,不是拿二值化后的图像进行操作了

而是需要拿原始彩色图像。

算法的目标是:在一个ROI内,统计出里面的色块种类数

比如:有黄色,红色,蓝色等,每个颜色分成一个种类

如果,黄色和红色之间有过渡色的话,

就把这2个颜色种类合并成一个种类。

最后把颜色种类面积最大的轮廓认为是字符轮廓

这个算法我实现得比较复杂,有差不多300多行

几个小时写了又调试,最终结果如下:

上面一行是原图,下面一行是处理后的图

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线


上图中下面一行的图像是调试图像。

蓝色方框是最小包围框。不用管它

可以看到“横着来的”2条干扰线不见了。哈哈

再经过几个小时训练样本,识别率达到了80%以上!


验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线


OK,基本上大功告成了


数数纯用C#写的代码。

这个验证码代码1500行。

有3层类继承层次。(第二层是上一篇文章用的识别器类)

真惊人。


其实,我这个的实现算法,还有很多不足。

基本上理论和第一篇文章说的差不多。

什么N*M特征法。我个人感觉这个特征法不是很好用

比如:在一个字符被干扰线粘合拉长的时候,

整个包围方块就变形了

而中心矩是基于求出质心来计算的,

归一化钜又基于除以面积计算,

所以,可能矩是描述轮廓更好的办法

下次有机会试试矩。


——————————————————————


最后说下除了技术的题外话。

这个验证码我没事绝对不会去研究的,因为很耗费时间。

实验训练样本又是个体力活。


做这个码纯粹是一个这2天来加我的CSDN网友。

他一开始就提出做这个码并且谈价格。

有回报,我当然有动力去尝试了。

第一次做出来30%识别率,他不要,说要到80%以上

最后,做到了80%以上。完全符合了他的要求

他老哥子说一句:“算了,这个不做先了。

我还有事情,Bye,下次我们再合作。”

结果就删掉了我的Q,跑了。

我算是白忙一场。不过,安慰自己

至少我还可以写出这篇总结文章,

长了点经验(不光光是在技术上)


看这个验证码所属的网站的主页:http://pay.m3guo.com/

大概是什么“电魂在线充值系统”

做这个网站的验证码识别有什么经济效益?