zoukankan      html  css  js  c++  java
  • windows下简单验证码识别——完美验证码识别系统

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

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


    讲到验证码识别,大家第一个可能想到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+款云产品! 

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


    相关文章:
    【推荐】 kubernetes大概的工作原理

  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/163yun/p/9810983.html
Copyright © 2011-2022 走看看