windows下简单验证码识别——完美验证码识别系统

叁叁肆2018-10-18 15:50

此文已由作者徐迪授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


讲到验证码识别,大家第一个可能想到tesseract。诚然,对于OCR而言,tesseract确实很强大,自带的字模能识别绝大多数规整的中英文。但是验证码毕竟不是OCR。对于现在简单的验证码,其干扰都很难规整的去完,或者说去干扰也是苦差事。你很难讲干扰去完后去做OCR,对于低成本的OCR识别更是这样。对于固定的验证码,针对性的训练库反而更有效,因为对于单一的验证码,其生成规则相对简单,用特定规格做字模识别率95%以上应该不难。

说到底还是需要一个简单的识别器,训练器。某次世纪识别系统是国内灰产码农用的最多的吧。可惜收费的,今天要介绍的完美验证码识别系统是类似的免费产品。验证码识别系统其实就是两部分组成,字模制作系统包括预处理的配置,和单字符字模制作以及生成字模打包文件,识别系统就是用字模打包结果去识别验证码,就是一个设置参数的函数,然后调用设别函数拿到结果。

  软件内容如下:

WmCode.dll是主要的识别库,主程序负责字模生成,其中包括了众多图像学的算法,如下图,简要的介绍下常见的方法。

1.色彩通道噪点处理

在清除背景和保留前景的tab中有保留和去除指定颜色的操作(包括HSV RGB 色彩域),以及指定色彩的大小过滤。这些操作主要针对色彩较为有限的彩色小噪点,一般这种验证码噪声还是比较多的。通过这2种方式的结合,基本可以去掉大部分的此类噪点。

2.滤波类

主要针对灰度图处理,主要处理局部有灰度差异的噪声。很多验证码在局部制造一些高对比度的噪声,滤波操作对此类就有较好效果。另外的用途就是边缘提取,方便后期对干扰线的处理。

3.二值化

后边几类如形态学处理类,黑白图处理,干扰线处理,都是基于二值化后的图像,所以后边要先对图像二值化。软件把常见的阈值取值算法都放进去,具体算法这里就不讲了。

4.形态学处理

图像滤镜tab下包括了主流的形态学算法,开闭操作,轮廓骨架等。主要处理小噪点,以及取轮廓后方便后期去干扰线。

5.干扰线处理

最后的tab中包含对干扰线的检测去除检查去除算法

通过多个处理算法完成预处理,点击开始编辑图像,进入下一步,选择分割方式,识别方式和制作字模。

虽然有提供一些常见的分割方式,但对于大多遇到的非规则的验证码,分割效果确实不是很好,选择手动分割就不要管左边的配置了。识别模式首选整体识别,其他各种在实际识别中也不是很好。

下边主讲字模的制作。在工具区最左边的按钮,手动裁剪单个要处理的字,选择后双击,界面就变成单个字符处理。

在信息区输入要 训练结果,就会添加字模。操作应该算很简单。不断的训练,直到识别率到达满意为止。返回上个界面,点击识别库,识别库生成,填写密码(调用函数用),就会把库生成在项目目录下。识别的过程,其实在软件下给了函数的简单说明,以及各语言的样例,以python为例,看下大概的过程:

#coding=gbk#第一行注释不能省,指定编码声明以支持中文#本代码文件在32位的python 3.4.3版测试通过import urllibimport timeimport stringimport ctypesfrom ctypes import * 

dll = ctypes.windll.LoadLibrary('WmCode.dll')#如果dll不在当前目录,那么需要指定全路径if(dll.UseUnicodeString(1,1)): #这个函数用来向DLL说明传入的文本使用unicode格式
        print('SetInUnicode Success:')#UseUnicodeString调用一次即可,无需重复调用else:
        print('etInUnicode Fail!')#注意缩进格式if(dll.LoadWmFromFile('D:\网易论坛.dat','163')):#使用绝对路径
        print('Loaddat Success:')#LoadWmFromFile调用一次即可,无需重复调用
        Str = create_string_buffer(20)#创建文本缓冲区
        if(dll.GetImageFromFile('D:\wylt.JPG',Str)):#使用绝对路径
                #如果验证码图像不在当前目录,那么需要指定全路径
                print('GetVcode Success:',Str.raw.decode("gbk"))                #返回的文本自行处理口口口问题
        else:
                print('GetVcode Fail!')                
	
else:
        print('Loaddat Fail!')#注意缩进格式

所有的函数封装在WmCode.dll中,导出的了几个基本函数。第一个指定使用unicode,和语言互调用有关。LoadWmFromFile 函数加载库文件,就是我们用主程序训练的结果,第二个参数是导出时填写的密码,GetImageFromFile 方法直接对本地文件进行识别,第一个参数是图片地址,第二个是输出的结果。调用函数相当简单的,对比tesseract复杂的参数,这个识别是相当的快捷。在力求快速生成识别代码的情况下,用这个库确实非常方便。


网易云易盾提供新一代网站验证码,包括智能验证码、滑动验证码等形式,验证码接口稳定性 99.9%,感知威胁可智能切换验证难度,告别繁琐验证,保护业务安全,点击可免费试用


网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 分布式存储系统可靠性系列三:设计模式
【推荐】 一个小白的测试环境docker化之路