今天要介绍Java的OCR(图片字符识别)包,由Asprise出品。它甚至可以读条形码。

请从下面的链接下载包含破解的zip文件。

Asprise-OCR-Java-Windows_XP_32bit-4.0.zip

这个包用起来非常简单。

解开上面的zip后,里面有demo-src.jar,把这个jar也解开,打开 com/asprise/util/ocr/demo/Demo.java 看看,就全明白了:

/* * $Id$ * */ package com.asprise.util.ocr.demo; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.asprise.util.ocr.OCR; public class Demo { public static void main(String[] args) throws IOException { if(("1.4").compareTo(System.getProperty("java.vm.version")) > 0) { System.err.println("Warining: /n/nYou need Java version 1.4 or above for ImageIO to run this demo."); System.err.println("Your current Java version is: " + System.getProperty("java.vm.version")); System.err.println("/nSolutions: /n"); System.err.println("(1) Download JRE/JDK version 1.4 or above; OR /n"); System.err.println("(2) Run DemoUI, which can run on your current Java virtual machine."); System.err.println(" Double click the 'runDemoUI' to invoke it./n"); return; } System.out.println("Welcome to Asprise OCR v4.0 Demo!/n"); if(args.length < 1) { System.err.println("Usage: java Demo PATH_TO_IMAGE [Description]"); return; } if(args.length >= 2) { System.out.println("-----------------------------------------------------------"); for(int i=1; i<args.length; i++) System.out.println(args[i]); System.out.println("-----------------------------------------------------------/n"); } File file = new File(args[0]); System.out.println("Trying to perform OCR on image: " + file.getAbsolutePath()); //OCR.setLibraryPath("E:/Twain/OCR/OCR+i/Release/AspriseOCR.dll"); BufferedImage image = ImageIO.read(file); String s = new OCR().recognizeEverything(image); System.out.println("/n---- RESULTS: ------- /n" + s); } }

用ImageIO的read方法从File读入BufferedImage,然后把Image传个OCR类的recognizeEverything方法,这个方法会返回分析出来的字符串(英文和数字)。

核心的方法就是这些了,但是用它来处理大多数网站的验证码,都不太好使。

原因很简单,大多数网站的验证码都加入不同程度的噪音,以防止OCR软件的自动分析。

所谓的噪音就是,加入背景颜色,或者加入杂七杂八的点,或者加入横七竖八的线,然后就是扭曲文字等等。

那么怎么才能去掉这些噪音,从而让OCR可读呢?

这里以我以前做开心网外挂时用到的程序片段来做例子,给出点思路。

这个程序现在已经不能用了,因为开心网现在的验证码是由汉字组成的了,Asprise只能识别英文和数字。

BufferedImage image; image = ImageIO.read(new ByteArrayInputStream(buffer)); int width = image.getTileWidth(); int height = image.getTileHeight();

首先,看一下上面的代码,其中 buffer是一个 byte[],它可以是用File打开的二进制文件,用InputStream的read方法读出的byte的全部,也可以是给出的网站的图片的URL,用HttpClient或者其他方法读入的图片二进制流。用ByteArrayInputStream转换后,被ImageIO的read方法转成Image。

Map<Integer, Integer> mapColor = new HashMap<Integer, Integer>(); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) { int color = image.getRGB(i, j); Integer count = mapColor.get(color); if (count == null) count = 0; count++; mapColor.put(color, count); }

上面的代码是对Image进行处理。一个二重循环,用image.getRGB方法来取得每个点的颜色,然后对颜色计数,并放到一个HashMap里去。

这是为后面的去噪音做准备。

后面的代码,针对不同的噪音,要用同的方法。这里只是给个思路。

List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>( mapColor.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { @Override public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) { return o2.getValue() - o1.getValue(); } }); list = list.subList(0, 5);

上面是把,已经处理过的HashMap(key是颜色,value该颜色的点的个数)进行排序得到 list。

开心网的验证码是4位,然后每个的颜色不同。那么取list的前5项,必然是背景色和4位验证码的颜色。

list = list.subList(0, 5);

然后再来个二重循环,把不属于这5种颜色的点,全变成背景色,也就是去噪音了。

int intBack = list.get(0).getKey(); Set<Integer> setColor = new HashSet<Integer>(); for (Map.Entry<Integer, Integer> entry : list) { setColor.add(entry.getKey()); } for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) { int color = image.getRGB(i, j); if (setColor.contains(color)) continue; image.setRGB(i, j, intBack); }

上面的程序,首先取出list的第一项(背景)的颜色:int intBack = list.get(0).getKey();

循环体中,如果是背景色或者验证码的颜色(if (setColor.contains(color))),那么继续循环;否则,该点为噪音,要设置成背景色(image.setRGB(i, j, intBack))。

最后,当然就是把处理过的Image交个OCR了。

String strCode = ocr.recognizeEverything(image).trim().toLowerCase() .replaceAll(" ", "");

由于分析的来的字符里出现空格的可能很大,所以要删除。

以上的程序,对加入横七竖八的别的颜色的线的加噪音方法比较有效,加别的颜色的点,也可以处理。

然后对于别的噪音,这里只给点思路,就不给出算法实现了。

比方说,对于那些加入和验证码颜色一致的杂七杂八的点的处理。前面的方法不能去除这种噪音。

我们可以做这么个二重循环,分析每个点,如果这个点颜色的四周(上下左右4个点,或者包括斜角共8个点)的颜色不同,而四周的颜色都一致,那么就判定这个点是噪音点,把它设置成和四周颜色一致。

当然,这个噪音未必是一个点,也许是个块,比方说2*2个点,或者3*3个点。如果这样,处理稍微麻烦点。可以用围棋博弈算法里的分块算法,取得每个小块,那些特别小的就判定为噪音。

然后说说关于扭曲,通常是把字母的上下往左右拉升。如果要其归位,比较难,未必一定可以实现。

可以考虑,用分块算法,取得的每一块,一个一个处理。处理时,把最左上和最左下画连线,算斜率;最右上和最右下也算斜率。取平均值,然后以平均斜率为base进行纠正。

用Asprise的OCR包,处理验证码。相关推荐

  1. 用Asprise的OCR包,处理验证码

    今天要介绍Java的OCR(图片字符识别)包,由Asprise出品.它甚至可以读条形码. 请从下面的链接下载包含破解的zip文件. Asprise-OCR-Java-Windows_XP_32bit- ...

  2. 用Asprise的OCR包,破解验证码

    今天要介绍Java的OCR(图片字符识别)包,由Asprise出品.它甚至可以读条形码. 请从下面的链接下载包含破解的zip文件. Asprise-OCR-Java-Windows_XP_32bit- ...

  3. python—简单数据抓取四(利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站、利用百度云的ocr识别自如租房网价格图片获取到自如网的价格)

    学习目标: python学习二十四 -简单数据抓取四 学习内容: 1.利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站 2.利用百度云的ocr识别自如租房网的价格图片,获取到自如网的价格数据 1.利 ...

  4. python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统

    操作步骤: 1:登陆打开CET-考试系统 2:填写相关登陆信息 3:调用百度ocr实现文字验证码识别 4:实现登陆 如何使用和调用百度ocr文字识别接口 1:进入百度AI开发平台:链接 2:在页面上选 ...

  5. python实现OCR识别图片验证码

    用cv2模块读取和显示模块 #导包cv2拓展模块 import cv2#先给窗体起名字 cv2.namedWindow("ShowImage1") cv2.namedWindow( ...

  6. 爬虫-OCR技术识别验证码

    一,OCR的安装 先去官网:Index of /tesseract (uni-mannheim.de) 仔细找一下,下载tesseract-ocr-setup-4.00.00dev.exe这个文件,大 ...

  7. 【爬虫】学习:OCR识别图形验证码

    GitHub python3网络爬虫开发实战第二版--8.1 环境问题 安装 1.参考:Tesserocr 的安装 | 静觅 在 Windows 下,首先需要下载 Tesseract,它为 Tesse ...

  8. 百度云 OCR 识别图片验证码

    操作系统:Mac OS Python版本:3.7.2 OCR:百度云 遇到的问题: API测试过程中,遇到API Resopnse 为图片验证码的情况,需要对图片进行识别得到text code,进行断 ...

  9. Python OCR识别图片验证码(二)

    操作系统:Windows Python:3.5 欢迎加入学习交流QQ群:657341423 上节讲到验证码的简单识别 但对于一些复杂的验证码,我们需要做一些简单的图片处理才能识别. 例如,我要识别这些 ...

最新文章

  1. Android动态替换dex,Android DexClassLoader动态加载与插件化开发
  2. 控制div的大小自适应_可以漂移的电动轮椅,采用“自适应重心控制系统”,根本不怕翻车...
  3. ios 前端时间显示NaN异常解决办法
  4. 查找文本(grep)
  5. 【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | 配置过程 )
  6. Android中RatingBar的自定义效果
  7. Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
  8. 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
  9. IOS和Android音频开发总结
  10. java web 有哪些标签库_java web中jsp常用标签
  11. h5 一镜到底_这些一镜到底的H5还能怎么玩?
  12. Hibernate Tomcat JNDI DataSource示例教程
  13. Java界面设计的用途
  14. 操作系统原理(七)文件系统
  15. 使用 artitalk + LeanCloud 配置给个人博客搭建说说
  16. 通用计算机实习周记,实习周记100篇通用版|绘图员实习周记范文
  17. 2022爱分析・人工智能应用实践报告
  18. 【笔记】研究生的早期科研之路(作者:中国人民大学 赵鑫)
  19. 为什么要有SerialVersionUID?
  20. 计算机网络期中考试,计算机网络期末考试试题及答案_计算机网络试题及答案...

热门文章

  1. js闭包优缺点及其应用?
  2. 【Wannafly Camp day 2】【Legilimens Contest 3】
  3. 卷起来了,国产显卡再添新成员,主打性价比
  4. 到底什么是“云原生”?
  5. JavaSE · 常量介绍 · 变量类型转换 · 理解数值提升 · int 和 Stirng 之间的相互转换
  6. C语言学习12.20(万里长城第一块砖)
  7. 初学Java方法猜数字游戏猜1~99中的随机数字
  8. 交付工程师应掌握的知识点
  9. UUID是什么及其获取方式
  10. AH8601:12v转5v 2a大电流转换器