论坛灌水机(续二--验证码)

来源:互联网 发布:阿里云合作伙伴有哪些 编辑:程序博客网 时间:2024/04/29 23:48

实际上,开发验证码是一件并不讨好的事情。在国外的论坛上,人家给出的权威验证码识别解决方案是:去雇用低能者,让他们人工填写验证码 。理论依据是:验证码技术的目标就是让低能者都能认识的东西,计算机识别起来却难于登天。

因此,除非识别技术在基础理论上出现重大突破(Matrix?),否则一个编程新手开发的验证码很容易就能击败数十位专家几年的结晶(例证:google刚开源的tesseract-1.02, 之前由HP开发,据说是识别能力在当时排业界第三,不过它经过本人实测,除了几乎近于文本验证码的那种,没有一个可以直接识别出来,可以说,识别率几乎为0)。

难道对验证码真的没有一点办法了吗?并非如此,其实大多数人对验证码破解的研究都误入歧途了:他们企图开发一个万能的识别软件,一劳永逸的识别全部验证码。

我们借鉴一下黑客们的思路,他们借助工具,但是大部分时候是人工介入的,没有一个黑客傻到要开发一个万能黑客工具,实现全自动的攻击吧?

我就直接说说我的思路:
    不要花时间在OCR识别上, 着重解决图片上的干扰信息
我的具体做法:
    用灵活可配置的前端进行去除干扰的操作,后端搭配一个大块头的OCR软件

简单的解释一下,应该很好理解:OCR许多厂商做了10几年了,也才这个样子,所以,如果你不是这个领域内的专家,就不要指望比人家的做的更好,如果你是专家,请不要继续看了,本文不适合你。
这些OCR单从识别率来说,许多都是可以接受的,但是他们存在统一的弱点:不能抗有意识的干扰,因为他们的产品设计主要是用于抗自然干扰的,例如旧报纸。而不是针对倾斜、背景等等。所以我们需要替OCR软件排除干扰,至于怎么做,对不起,没有万能的方法,最有效的就是针对特定的某个验证码的特征来定制,初期会觉得麻烦,但是定制的多了,你会发现你已经找到了许多单独的操作,这些操作组合起来就能排除某类型的干扰,有了一些积累之后,你就发现除非是特制的特征码,一般论坛上的验证码你都不屑去破的。

 下面我对这两个方面分别做下稍微具有可操作性的说明:

一、如何使用OCR软件:

OCR软件除了它的操作界面本身,一般还有它的编程接口。例如office 2003自带的OCR功能,你可以通过创建"MODI.Document"的COM对象来使用其OCR。示例代码如下(用javascript写的):

<script>
 var doc = new ActiveXObject("MODI.Document");
 doc.Create("c://1.bmp");
 doc.PrintOut(0, -1, 1, "Microsoft Office Document Image Writer","c://test.tif", 0 ,1);
 doc.Close();
 doc.Create("c://test.tif");
 try{
 doc.OCR(0x09, true, true);
 var tex = doc.Images(0).Layout.Text;
 doc.Close();
 alert(tex);
 }catch(e)
 {
  doc.Close();
 alert(e.description);
 }
</script>

这只是作为一个例子,实际上没人真的用这个来识别验证码,因为它这个准确率太低了,完全不加干扰还错的挺多的。而且还有......总之不要用就对了,这个OCR底层实际上不是微软做的,看文件版本应该是从清华/文通买过来的。

除了这个,留心去找一下,还有一些不错的OCR,如果你购买来用,可能能得到技术支持,把开发接口,还有训练的方法都给你,那就爽了。舍不得买的话,只好弄个破解版,自己琢磨接口该怎么调用吧。

我说说我自己用过的一些OCR----TOCR,Transym公司,找不到文档,不过其主页上有示例代码下载,开发包里面不提供训练功能,但是其识别能力还是很不错滴。这个可以免费下载试用,试用版好像没什么限制,反正我是没找到。

----PrimeOCR,这个应该来说,功能比TOCR要强一些,它其实是调用了TOCR的一些功能,但是定制性强一些,可以通过降低识别速度来达到更高的精度,而且可以自己训练,对于验证码识别来说,再合适不过了。这个文档很全,不过网上找不到程序下载,你可以去它的主页上找到他们的email,索要一份试用版,试用版其实有很多方式可以做到和正式版没什么区别的。

二、 如何去除干扰?

最简单的一个去杂点的操作是先转成单色位图,然后用median滤波。
除此之外,我们还有一些方法:

辨别背景色:有时候遇到背景色与字符颜色的灰度值相同时(就是那种色盲图),直接转单色图就行不通了,这时可以用统计的方法排除出背景色。(例如,看某种颜色出现的频率,范围等等特征)

突出字符:用膨胀、腐蚀相结合的方法来做,因为经过滤波后,可能某些字符不够清晰了。

其实简单的图像并不是太难,许多独创性算法也很容易可以想到,只是碍于实现起来有困难。这里推荐一个图像库:cxImage,开源,及其好用,能在各种格式间装换,并且内置了一些常用的处理方法。在cximage基础上作开发,你就不用面对具体的某种格式了。

我将在下一篇中详细的讨论图像去噪的各种手段与实现

原创粉丝点击