识别验证码,你有几分成功率?

本文探讨了OCR技术在识别网站验证码的应用,对比了Tesseract OCR、Asprise OCR及Java OCR三种工具的效果,并分析了影响准确率的因素及提升策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在验证码几乎在任何一个网站的交互界面中都存在,目的当然是为了防止恶意程序的攻击。如果我们想获取到验证码,就需要从这个验证码的图片中分析出来到底是什么字符。这就需要 OCR 技术。

 

  Optical character recognition(OCR)   是指从扫描的图片或者手写的输入转换成相应的字符的技术。大家用到最多的是手机上的手写功能,或者手写板。有 2 个 OCR 项目大家用的比较多: 1. Tesseract OCR 2. Asprise OCR , 其中 Tesseract OCR 是开源的, Asprise 是商业的。另外, 我还发现了一个基于纯 java 实现的 OCR 项目: Java OCR , 目前还只是 Alpha 版本。 我们来弄几张验证码的图片测试下每个软件的识别率是多少:

 


准确率
Tesseract OCR ZYQQDSGWHRKSGWWPT0%
Asprise OCR-----0%
Java OCR-----0%
0.jpg
准确率
Tesseract OCR32840985779114118986100%
Asprise OCR32840985779114118986100%
Java OCR32840985779114118986

100%

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

从上面的图表我们看出, 针对干扰过的验证码, 三个软件都没能识别出来,而针对比较简单的规则数字组成的验证码, 三个软件的识别率都高达 100%。 我们细分析下两组验证码之间的不同:

 

  在第一组验证码中:

每个字符都有倾斜,而且倾斜角度不同

每个字符的大小有稍微的不同

字符中间没有空隙

有另外一道干扰的黑线不规则的穿过其中的几个字符

每个字符的字体稍微不同

 

  在第二组验证码中:

字符间有很大的空隙

字符都加粗

字体大小统一

字体一样

 

从实验结果上看,如果想提高识别率的话, 图片应尽量向第二组的图片靠拢。 那为什么第二组的图片识别率高呢?我们看下 OCR 的原理。

 

OCR 原理

  OCR 在扫描目标图片的时候, 需要加载 Trained Image,分割目标图片中的文字到单个字符[1],然后遍历每个 Trained Image 里的字符图片, 从而推测出图片里字符是什么。

 

加载 Trained Image

  OCR 程序之所以能够识别出图片中的字符,是要有个图片库进行比对的, 这个图片库一般被称为 Trained Image, 一般都允许用户自己定义新的 Trained Image。每个 Trained Image 里都有很多字符, 基本都是按照行列分布, 格式一般为 PCX 格式。每个 Trained Imge 都有自己的元数据, 说明哪个区间里的图片对应哪个字符。 程序加载 Trained Image 的时候, 会先分析有多少行,然后逐行扫描,再分析有多少列, 然后精确到一个区间坐标: [(x1, y1), (x,y2)], 其中 x 为 行, y 为列。然后根据元数据把该区间对应的字符和区间里的图片对应起来。研究了下 Java OCR 加载 Trained Image 的时候, 是通过分析一行里所有的像素点的值是否有都大于一个浅色值 128 来判定当前行是行间隙还是行中间,同理适用于列扫描。 下面这张图片是个典型的 Trained Image:

 

   扫描目标图片

  加载 Trained Image 后, OCR 程序会根据同样的原理分割目标图片中的文字到单个字符[2], 然后逐个比对 Trained Image 里的字符图片, 找到最匹配的字符。 一般匹配的时候,会比较图片的长宽比率差是否在容忍范围内; 上下左右四个方向的空白区域宽度差是否在容忍范围内;目标图片的大小是否和 Trained Image 相差太大等等。

 

  从原理上看,识别的准确度在于三点:

  • Trained Image
  • 图片匹配算法      
  • 目标图片质量

那怎样提高识别率呢? 针对以上三点:

  • 尽量针对目标图片类型,定义自己的 Trained Image。
  • 添加尽量多的识别参数。
  • 通过对目标图片的去噪, 分割,旋转等手段尽量向第二组验证码图片那种质量靠拢

 

  当前国内大多网站的验证码都已经过千锤百炼, 验证码几乎连人都看不清了, 何况程序乎? 所以我认为如果网站想真正发挥验证码的作用,程序是识别不出来的。像第二组那样的验证码,不知道有什么存在价值(第二组的验证码这个来自一个国企的邮箱登录界面)。

 

 

[1] 也可能有分割到词的,这里只表述我研究的 Java OCR 。

[2] 分割目标图片的时候,有可能不仅仅需要靠间隙,应该还有其他方法, 这里只列举 Java OCR 使用的。

使用过程注意事项: 1.调用DLL识别识别,多线程下不需要加许可证,支持并发识别. 2.调用DLL识别,识别参数设置命令SetWmOption必须与你弄字库时候的设置参数一样,不然会导致识别率下降具体参数说明,请看调用例子里的[我的函数.txt]文档有对应参数说明. 3.如果遇见本工具无法识别验证码,可以找群主(用神经网络识别)定制,价格便宜公道. [2017-07-27] 完美验证码识别系统V3.2 1.增加DLL识别返回方式2和3具体看我的函数.txt里说明,主要是增加一个可以返回识别后的总体信任度.这个值你可以给它个阀值,比如说如果总体信任度小于60,那么你就不提交服务器,直接重新获取图片识别,直到总体信任度大于60你才提交给服务器,这个阀值具体多少,自己可以先测试. 2.修复导出字库没有导出完,直接关闭窗口崩溃问题 3.添加批量下载后定位到批量下载文件夹 4.增加可以使用验证码长度进行过滤,增加可以使用总体信任度进行过滤.(这两个功能可以快速的制作字库,比如说你验证码是4位的,你可以设置验证码小于4,大于4那这张图片肯定是识别错误的,那么软件就会把这张图片保存下来,同理可以使用总体信任度进行此保存) [2017-07-20] 完美验证码识别系统V3.1 1.修复数组下标越界问题 2.字库列表添加可以多选然后右键批量删除选中项 [2017-07-13] 完美验证码识别系统V3.0 1.修复导出字库,重复导出不会覆盖原来的BUG,导出的图片会累加上去(注意,以前导出的字模导入新版中会出错,新版字模导出格式为a_md5.bmp 请自行写个软件修改文件名,然后再导入) 2.修复添加字库空格都可以添加进去 3.修复崩溃问题.(崩溃应该绝大多数都是此原因造成的.) 4.其它一些调整. [2017-06-25] 完美验证码识别系统V2.6 1.解决输入焦点问题. 2.批量下载增加可以过滤掉宽度范围,面积范围,高度范围,黑色数范围,可以去掉没有用的干扰图片. 3.其它的一些细节调整 [2017-06-07] 完美验证码识别系统V2.5 1.修复去除干扰滤镜在没有先二值化图片都可以使用. 2.尝试解决添加字库崩溃问题(代码较多,找到1处问题.不知道还有没有其他问题) 3.编辑字库页面增加个选中框[添加字库后自动下载图片],使用批量下载图片,可以快速添加字库 4.使用截图工具,截取图片后,会自动切换到划线工具. [2017-05-17] 完美验证码识别系统V2.3 1.修复设置滤镜默认都有选择项. 2.修复当使用本地图像时,没有新建项目都可以编辑的问题. 3.修复黑白处理滤镜在没有先二值化图片都可以使用. 4.修复处理很多逻辑错误会导致程序崩溃. 5.增加字库列表添加右键删除当前选中的字库 6.增加禁止重复运行,由于重复运行会导致字库添加失败,和读取不到已经做过的字库. 7.增加快捷键"自动分割(Alt+R)" ,"手动分割(Alt+T)" 8.编辑页面增加个批量下载按钮,可以实现批量下载并自动分割图片功能(批量下载的图片保存在当前项目文件夹下的"批量下载"文件夹中) 9.主窗口增加一个选择框_图像已处理不使用滤镜,由于批量下载后图片都是已经使用过滤镜了,处理批量下载的图片这里必须得勾选上,不然会重复运用滤镜 [2017-05-07] 完美验证码识别系统V2.2 1.新增分辨率1024*768布局 2.修改注册热键方式为本进程方式(原为全局热键,感谢群友XGSoft提供源代码) [2017-05-06] 完美验证码识别系统V2.1(要求屏幕分辨率最低1440*900) 1.去掉窗口最大化,去掉自动调整窗口大小代码,修复部分控件显示不全 2.增加检测图像是否二值化,没二值化的图片不允许编辑 3.尝试解决添加字库崩溃的问题(不确定问题出在哪!!) 4.解决滤波数组越界问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值