复杂背景的验证码破解
首先我们要去除它的背景,对于这样稍微复杂的背景,用过去的方法很难做到,上图的例子还不是很明显,我发现很多图片背景色和字母色近似,而且字母颜色是不断变化的,背景也是不断变化的
那我初始的想法是找到图片中使用颜色最多的方法,于是我们用HSL表示各点颜色,接着进行统计,得到最大的几个峰值,这里便是图片中几个最丰富的颜色的L值得累加值
其余的都可以认为是噪音,我们对每个峰值进行分割,得到如下图片
你看这样就把单个颜色图片分割出来了,接下来就是找到图片中除去黑色和白色后的图片
然后进行灰化处理,阀值处理,降噪,得到
接着根据边界检测出来的最左侧x位置,来排序字母顺序
接下来的事情就轻车熟路了,把图片转成标准模板,通过少量学习就达到了95%以上的识别率
c:15 j:8 8:7 t:9 9:4 x:7 4:6 2:4 h:7 f:8 e:18 b:5 y:3 k:4 w:3 g:5 3:5 7:6 r:2 m:3 q:4 v:2 p:3 6:2
以上数据表示 c学习15次 j学习8次…
只要字符不粘连,大部分验证码干扰技术都是可以有办法,所以为什么google验证码看起来很简单,但是没有人能够很好的破解它得原因。
补充,
rise在留言中发现有一些字符加入杂点的问题,由于这种验证码不是很普遍,稍微做了研究

CY3E 这个图片3字中有杂点,其他没有,按照文章中介绍的办法,怎么知道这个3不是像其他颜色杂点一样的图片呢?

我觉得需要加入一个步骤,就是对每次过滤颜色生成出来的图片,进行填充
找到3的杂点原图:

然后我们进行算法填充

这个图片与其他全部是杂点的图片之间的差别进行过滤,我考虑可以通过以下方法:
1、连贯点的宽度
2、连贯点的个数
这样剩下的就只剩下CY3E的过滤后的图片
至于字符倾斜的问题,我觉得完全可以在机器学习过程中,我们自己旋转正在学习的图片一定角度,例如从-10到+10度,只不过这样的学习库会大一些,但是就10个数字的验证码来说,这点性能损失应该可以忽略不计。











7月 18th, 2008 at 18:53 #rise
你这个是什么时候的版本的?现在discuz每个字符都加入了很麻烦的杂点,字符不再是纯色的了,这个怎么处理呢?还有,部分验证码两个字符是同样的颜色的,这样也不好办吧?
7月 20th, 2008 at 03:32 #4111y80y
to rise:
我们现在只完成这两种
http://www.discuz.net/reg.php 里面的这种在另外一篇里面有介绍
http://www.seoo.org/2008/06/09/discuznet%e7%9a%84gif%e5%8a%a8%e7%94%bb%e9%aa%8c%e8%af%81%e7%a0%81%e7%a0%b4%e8%a7%a3%e6%88%90%e5%8a%9f.html
不知道你说的哪种,给个例子吧?
7月 20th, 2008 at 21:22 #rise
我说的是复杂背景这种,而且我研究的这种,字符角度随机、字符可能出现同色、且字符内有明显的杂点。以致于我开始用字符颜色来匹配、去背的时候,常常连字符杂点去去掉了,这样字符内就会出现“镂空”的现象。以下是一个具体的链接,可以用ps放大研究一下。
http://www.tz94.com/bbs/tz94.php
7月 20th, 2008 at 21:27 #rise
你所举例子,是一个字符内没有杂点的纯色字符,而最后识别结果那些验证码却是全部有杂点的,会不会你制作图的时候压缩图片时引入的?所以在这里提一下疑问,具体你用ps观察一下。另外你写的这个贴子我很喜欢,排版、实验结果图都做得很精致,看得出你是非常用心的一个人。
http://www.seoo.org/2008/07/06/%e5%a4%8d%e6%9d%82%e8%83%8c%e6%99%af%e7%9a%84%e9%aa%8c%e8%af%81%e7%a0%81%e7%a0%b4%e8%a7%a3.html#comment-5
我说的是这个主题
7月 21st, 2008 at 02:27 #4111y80y
to rise:
http://www.discuz.net/reg.php
因为是discuz论坛的官方网站,所以研究这种会有一定的普遍性
个别字符内部杂点的问题,我刚才用你的例子做了一点测试,在本文中做了一点补充
7月 21st, 2008 at 17:06 #rise
不错。我用的是近似色的方法,字符内的杂点大都与字符色本身很接近的,在用smooth方法后,颜色更为接近了,这样就可以把杂点与字符色处理成同种颜色(作范围测试)。
7月 21st, 2008 at 17:21 #4111y80y
对,我去看看smooth的效果