由于现在很多网站,为了加强安全性,以及防止程序的自动操作网站,都加入的了验证码技术。但却给广大站长推广宣传网站带来的麻烦。所以我准备写这篇关于验证码识别技术的文章,不足之处在所难免!本人从来不写东西,今天为了想落伍才写了!
广大站长宣传推广自己的网站,经常要发布一些宣传广告,如果靠人工,太慢太昂贵,所以理想的办法是使用群发软件,可现在很多网站都有验证码,这成为群发软件的技术难点,而识别也就难点中的难点,好的,闲话少说,言归正传!
我举的例子是比较难于识别的验证码,不讨论不变形、不换字体、不换大小、不旋转的验证码,这里我可能不会写出代码,只是提供我编写的思路,按照这个思路,我写出的程序,比市场上出售的程序的识别率还要高很多。(有兴趣的可以问我,我不想在这里帮别人宣传,呵呵~~)
首先以数字验证码开始,字母的要比数字麻烦一些,不过搞清楚了数字验证码的识别,字母的也就不难了。
验证码一般都是图片,而且一般都是4位数,处理过程是:先分割为4个部分,然后逐一识别,由于分割比较简单,我这里就不说了,我这里只说如何识别。
我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,为什么要划分为15个块呢?先看图!
○■○
■○■
■○■
■○■
○■○
○■○
■■○
○■○
○■○
■■■
■■■
○○■
■■■
■○○
■■■
■■■
○○■
■■■
○○■
■■■
我先举这4个例子吧,其余的大家可以自己画出来。如果做过验证码识别的朋友,肯定很快就明白为什么划分为15个块,其实主要就是因为这样划分更合理,也就更能提高识别率。
我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,然后对每个块进行计算,当每个块里的有效象素超过多少百分比的时候,就标记为 ■,如果没超过就标记为○,(这里为了显示方便我使用了■,○,你完全可以把它标为1、0),这里要注意一下,这里的百分比根据字体的粗细可以取 67%,50%,33%,20%,为什么要取这几个数?主要和计算机的浮点数运算有关,选这几个数,运算更快,且不容易出错,否则计算机在进行大量计算时也是会出错的!当然这里,你完全可以选适合你的验证码图片的百分比!!
如果验证码不变形、不换字体、不换大小、不旋转,我们的识别工作到这一步基本上就结束了,因为已经可以得到比较清晰的块图,对付大多数论坛,就已经足够了。^_^
如果验证码的变形比较大、且有很多字体、大小也不固定、且有旋转,那么我们经过划分、取比率显示后,可能会得到这样一个图:
○■○
○○■
○■○
■○○
■■■
那么这个数字应该是什么数字,我们需要使用排除法!排除所有不可能,在0123456789中,这个图不可能是013456789,他只能是 :2。
写过验证码识别的朋友可能已经明白了!是的,我们需要建立一个类似的数据库,也就是识别库,出现哪些图,他就属于那个数字。
再举一个例子:
○■○
■○○
■■■
■○■
○■○
这是哪个数字呢??是6,没错
我这里我需要再说明一下为什么要取5行,3列,15个块,因为块太多了你 的识别库就会很大,块太少了,就会出现很多分不清楚的块图。
另外你取的百分比也需要注意,不能太大也不能太小。
好了,等做好自己的数据库,这时就可以识别大部分数字了。
最后还有一个问题,就是重复的问题,比如,图片上的数字,明明是 5,可由于它的字体不是常见的字体,且发生了旋转,最后得到这样一个图:
■■■
■○○
■■■
■○■
■■■
在我的数据库里,这个块图,是6,也是就说识别错误,怎么办?
我的解决方法是,在数据库里先把这条数据删除因为这个是错误的。
遇到这种情况,就需要进行二次处理,我的方法是:降低百分比,这时就得到了:
■■○
■○○
■■○
○○■
■■○
OK,经过降低百分比,图片就由“6”又变为“5”了,呵呵~~~由于降低了百分比,我们需要再建立一个识别库的来存储这些数据。
好了,我的文章就写到这里,只是给大家提供一个思路,可能还有一些细节我没写出来,但主要的方法都提供出来了,希望能起到抛砖引玉的作用,也希望能够落伍!!!!
关于图灵测试的一点想法 A little of idea about The Turing Test
图灵测试是一种测试机器是不是具备人类智能的方法。被测试的有一个人,另一个是声称自己有人类智力的机器。测试时,测试人与被测试人是分开的,测试人只有通过一些装置(如键盘)向被测试人问一些问题,这些问题随便是什么问题都可以。问过一些问题后,如果测试人能够正确地分出谁是人谁是机器,那机器就没有通过图灵测试,如果测试人没有分出谁是机器谁是人,那这个机器就是有人类智能的。目前还没有一台机器能够通过图灵测试。
清楚了什么是图灵测试之后让我们开始,让我们问被测试人这样一个问题:“张三一米七,张三高吗?”。
人回答:“不高不矮,中等身材”。(对于中等身材的人,我们很可能会得到这样的回答)
我们再问:“张三一米七,张三高吗?”。
人回答:“如果是男人的话,不怎么算太高”。(人会有一种知识和潜意识,就是身高按照性别来区分,会得到差别比较明显的结果。如果你问一个人是不是富裕的话,人首先想到的肯定是城乡区别、区域区别、职务区别)
我们再问:“张三一米七,张三高吗?”。
人回答:“他比我高”。(如果你问一个人三个同样的问题,他一定会考虑一下是不是我的回答有问题,这时候他的潜意识,会让问题和自己联系起来)
现在再让我们问机器这样的问题:“张三一米七,张三高吗?”。
机器可能会得到这样两个语句:
i = 1.7 ;
if ( i > 高矮标准 ) print "高"; else print "矮";
其中只要确定“高矮标准”,就可以得到答案。高矮标准可以通过对大量数据的统计计算得到,或者通过引入知识得到。
最后机器会回答:“矮”。
我们再问:“张三一米七,张三高吗?”。
机器回答:“如果是黄种人的话,高”。
我们再问:“张三一米七,张三高吗?”。
机器回答:“如果是中国人的话,高”。
我们问机器一万次,它可能都不会回答:“他比我高”,机器只是机器,它没有自我意识。
我最后想举一个例子:也是下棋的例子,大家都知道中国的围棋是最复杂的棋种,现在计算机的围棋水平还不如一般的五段棋手水平。可是如果有一天计算机的运算速度足够快、存储容量足够大的话,那么普通的程序员也可以利用穷举算法写出一个围棋程序,得到围棋的所有解。
对于人类来说如此难的围棋,对于计算机来说竟然会这么容易?!这可能就是人类智力和机器智力的最大区别。