现
在验证码几乎在任何一个网站的交互界面中都存在,目的当然是为了防止恶意程序的攻击。如果我们想获取到验证码,就需要从这个验证码的图片中分析出来到底是什么字符。这就需要 OCR
技术。
Optical character recognition(OCR)
是指从扫描的图片或者手写的输入转换成相应的字符的技术。大家用到最多的是手机上的手写功能,或者手写板。有 2 个 OCR 项目大家用的比较多: 1. Tesseract OCR
2. Asprise OCR
, 其中 Tesseract OCR 是开源的, Asprise 是商业的。另外, 我还发现了一个基于纯 java 实现的 OCR 项目: Java OCR
, 目前还只是 Alpha 版本。 我们来弄几张验证码的图片测试下每个软件的识别率是多少:
从上面的图表我们看出, 针对干扰过的验证码, 三个软件都没能识别出来,而针对比较简单的规则数字组成的验证码, 三个软件的识别率都高达 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。
- 添加尽量多的识别参数。
- 通过对目标图片的去噪, 分割,旋转等手段尽量向第二组验证码图片那种质量靠拢
当前国内大多网站的验证码都已经过千锤百炼, 验证码几乎连人都看不清了, 何况程序乎? 所以我认为如果网站想真正发挥验证码的作用,程序是识别不出来的。像第二组那样的验证码,不知道有什么存在价值(第二组的验证码这个来自一个国企的邮箱登录界面)。
[1] 也可能有分割到词的,这里只表述我研究的 Java OCR 。
[2] 分割目标图片的时候,有可能不仅仅需要靠间隙,应该还有其他方法, 这里只列举 Java OCR 使用的。
- 大小: 1.6 KB
- 大小: 2 KB
- 大小: 1.9 KB
- 大小: 1.7 KB
- 大小: 2 KB
- 大小: 1.7 KB
- 大小: 2.1 KB
- 大小: 1.7 KB
- 大小: 1.9 KB
- 大小: 1.7 KB
- 大小: 223 Bytes
- 大小: 238 Bytes
- 大小: 237 Bytes
- 大小: 241 Bytes
- 大小: 228 Bytes
- 大小: 223 Bytes
- 大小: 236 Bytes
- 大小: 228 Bytes
- 大小: 198 Bytes
- 大小: 212 Bytes
- 大小: 119.1 KB
分享到:
相关推荐
本文提出了一种验证码识别系统的设计与实现方案,通过对图像的预处理、字符分割、特征提取以及字符分类等步骤,成功实现了对简单验证码和带噪验证码的有效识别。未来的工作可以考虑引入深度学习技术,进一步提高识别...
数字验证码识别算法则是其中的一种常见类型,其核心目标是通过计算机算法自动识别图像中的数字,以确保只有人类用户能够成功交互。 在数字验证码识别算法中,主要涉及以下几个关键技术点: 1. 图像预处理:这是...
3. **中等类**:增加了更多的识别难度,如背景干扰、字符变形等,使得识别率下降,但仍有较高的成功率。 4. **复杂类**:采用了最严格的防护措施,包括复杂的背景、多样的字符形式等,大大降低了自动化程序的识别...
验证码自动识别通常分为几个步骤:图像预处理、特征提取、模式识别和验证。首先,我们需要获取到验证码图像。在PHP中,可以使用cURL或file_get_contents函数来抓取网页上的验证码图片。一旦图像被下载,我们便进入...
需要注意的是,由于验证码的复杂性和变化多端,OCR识别的成功率并非100%。实际应用中,可能需要不断优化特征提取和分类器训练,以提高识别准确率。此外,现代验证码系统可能会引入更多防自动化手段,如滑动验证、...
在本项目中,我们关注的是一个使用易语言编写的验证码识别代码,它被标记为“绝对可用”,表明开发者已经成功实现了验证码的自动识别功能。 易语言是一种中国本土开发的、面向对象的、直观易学的编程语言,旨在降低...
通过上述方法,可以有效地提高验证码识别的成功率。需要注意的是,验证码的复杂程度和变化形式多种多样,因此可能需要针对不同的情况调整识别策略和技术栈。此外,对于更复杂的验证码类型(如滑动验证码),还需要...
为了提高验证码识别的成功率,我们还需要关注以下几点: - 数据集:大量的训练数据是训练模型的基础,应包括各种类型的验证码,确保模型具备泛化能力。 - 字符库:识别的字符应涵盖验证码可能出现的所有字符。 - ...
4. **人机交互**:用户在看到验证码后需要输入对应的字符序列,这个输入过程可以通过点击图像中的特定区域、拖动滑块、听语音验证码等方式完成,增加验证的复杂性,降低自动化工具的成功率。 5. **动态验证码**:...
8. 错误处理与重试机制:设计合理的错误处理策略,当首次识别失败时,可以尝试调整参数或采用其他识别方法重试,提高整体识别的成功率。 在易语言的实践中,需要结合具体项目的实际需求,选择合适的方法和技术,...
7. 整体验证:识别出的单个字符需要拼接成完整的验证码字符串,并与服务器的验证码进行比对,如果一致则识别成功。 在易语言中,可以使用其内置的图像处理函数来实现以上步骤,例如,使用"位图加载"函数加载图像,...
3. **验证码识别**:运用Office2003图像识别技术,自动识别验证码的成功率高达60%,手动输入可达90%,提升了发布效率。 4. **搜索引擎优化**:长期发布的信息使得公司在搜索引擎上的曝光度大增,关键词搜索时可获得...
4. 快速提交:在票源紧张的情况下,软件会迅速提交订单,提升购票成功率。 5. 定时抢票:用户可以设定抢票时间,软件会在指定时间自动开始抢票。 6. 多线程:为了提高效率,软件可能会使用多线程技术同时处理多个...
数字识别是模式识别的一个具体应用,通常用于自动识别图像或音频中的数字,如验证码识别、银行账户号码读取、车牌号码检测等。 C/C++是两种广泛使用的编程语言,它们以其高效性和灵活性著称,尤其适用于处理计算...
从这些文件中可以看出,这款抢票神器提供了一套完整的解决方案,包括自动识别验证码、详细使用教程、故障排除以及可能的12306网站限制的规避策略。然而,值得注意的是,此类工具可能违反了12306官网的服务条款,甚至...
→自动识别验证码,无需手工输入,自动提取; →支持产品图片发布; →可管理产品/供求信息,内容随意更改; →站点有效性高,成功率达80%; →发布进度及成功报告实时显示; →支持失败重发,待发送任务完成后,...
3. **处理反爬策略**:很多网站有反爬机制,如验证码、IP限制等,需要适当地处理这些情况,例如使用代理IP池、识别并输入验证码等。 4. **数据存储**:合理地保存和组织下载的图片,例如按类别、日期等信息进行分类...
- **代理IP池**:构建一个大规模的代理IP池,并根据访问频率和成功率等因素自动更新和维护。 - **多账户管理**:使用多个账号进行轮换访问,每个账号遵循真实的用户访问模式。 - **行为模拟**:通过分析真实用户的...