今天要介绍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 看看,就全明白了:
view plain
/*
* $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只能识别英文和数字。
view plain
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。
view plain
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里去。
这是为后面的去噪音做准备。
后面的代码,针对不同的噪音,要用同的方法。这里只是给个思路。
view plain
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种颜色的点,全变成背景色,也就是去噪音了。
view plain
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了。
view plain
String strCode = ocr.recognizeEverything(image).trim().toLowerCase()
.replaceAll(" ", "");
由于分析的来的字符里出现空格的可能很大,所以要删除。
以上的程序,对加入横七竖八的别的颜色的线的加噪音方法比较有效,加别的颜色的点,也可以处理。
然后对于别的噪音,这里只给点思路,就不给出算法实现了。
比方说,对于那些加入和验证码颜色一致的杂七杂八的点的处理。前面的方法不能去除这种噪音。
我们可以做这么个二重循环,分析每个点,如果这个点颜色的四周(上下左右4个点,或者包括斜角共8个点)的颜色不同,而四周的颜色都一致,那么就判定这个点是噪音点,把它设置成和四周颜色一致。
当然,这个噪音未必是一个点,也许是个块,比方说2*2个点,或者3*3个点。如果这样,处理稍微麻烦点。可以用围棋博弈算法里的分块算法,取得每个小块,那些特别小的就判定为噪音。
然后说说关于扭曲,通常是把字母的上下往左右拉升。如果要其归位,比较难,未必一定可以实现。
可以考虑,用分块算法,取得的每一块,一个一个处理。处理时,把最左上和最左下画连线,算斜率;最右上和最右下也算斜率。取平均值,然后以平均斜率为base进行纠正。
分享到:
相关推荐
坛子里有破解版的Asprise-OCR-Java,其原理就是利用开启CloseWin.exe窗口扫描有没有Asprise弹出过期的窗口,更具信息框的标题栏来判断是否要关闭此信息窗口。2011年7月以后的使用版无论是点击确定还是关闭按钮,都要...
数字图片识别 Asprise-OCR-Java 破解版 Eclipse工程 开发实例代码
数字图片识别 Asprise-OCR-Java 破解版 批量识别
【标题】"asprise-ocr-csharp-vb.net" 是一个专门针对C#和VB.NET开发者设计的OCR(光学字符识别)软件开发工具包。它主要用于帮助程序员在他们的应用程序中集成OCR功能,以便自动识别图像或扫描文档中的文本。 ...
Asprise-OCR-Java-Windows_XP_32bit-4.0原版及破解补丁大全 在网上找了很久,终于找到能用的版本.不敢独享,拿出来给大家.
Asprise OCR Java是一款专为Windows XP 32位系统设计的光学字符识别(OCR)软件开发包。OCR技术主要用于将扫描的图像或者照片中的文本转换为可编辑的电子文本,以便于进一步处理和分析。这款软件是用Java编程语言...
上个月传了一个5.01的版本,但只...http://cdn.asprise.com/ocr/files/downloads/15/asprise-ocr-csharp-vb.net-15.3-trail.zip ----------- 另,因为我在项目中只是去进行验证码的识别,其它有什么问题我没做测试。
1. **AspriseOCR.dll**:这是Asprise OCR的主要动态链接库文件,包含了所有OCR功能的实现。开发者可以通过引用这个DLL在自己的C#项目中调用OCR功能。 2. **DevIL.dll, ILU.dll**:这两个文件是图像处理库 Devil ...
在给定的压缩包文件"asprise-ocr-csharp-vb.net-15.3.1-trail"中,我们找到了C#和VB.NET的DEMO示例,这为我们深入理解并应用OCR技术提供了实际操作的平台。 1. OCR技术简介: OCR技术是一种利用计算机视觉和人工...
Asprise-OCR4.0 图像识别控件,包含开发文档,里面含有VB例子。 已将OOXX。
3. **AspriseOCR.dll**:这是OCR功能的核心动态链接库,包含OCR算法和处理逻辑。开发者在编程时需要引用这个库文件。 4. **DevIL.dll、ILU.dll**:这两个库文件是图像处理库,用于支持多种图像格式的读取和处理,...
在提供的压缩包文件`Asprise-OCR-Java-Windows_XP_32bit-4.0`中,我们可以预见到它包含了适用于Windows XP 32位系统的Asprise OCR Java库。 Asprise OCR的主要特点包括: 1. **跨平台支持**:Asprise OCR不仅支持...
1、把:AspriseOCR.dll、DevIL.dll、ILU.dll这三个动态链接库文件放到 windows/system32 下面 2、开发用到aspriseOCR.jar组件 3、开发实例代码:(实例代码)ParseJPEG_withOCR.java 4.CloseWin.exe是销毁本sdk调用dll...
Asprise OCR Java 15.3.1是一个用于验证码识别的框架,专为Java开发者设计。这个框架的主要功能是处理图像识别,特别是针对验证码的自动识别。OCR(Optical Character Recognition,光学字符识别)技术是一种将扫描...
光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。OCR技术非常专业,一般多是印刷、打印...本文主要介绍其中的一种Asprise识别技术
Asprise OCR v4.0 provides full support for Windows Vista, and most of 64bit operating systems. Additionally, Asprise OCR v4.0 features optimized OCR engine with higher accuracy and faster speed.
1、把:AspriseOCR.dll、DevIL.dll、ILU.dll这三个动态链接库文件放到 windows/system32 下面 2、开发用到aspriseOCR.jar组件 3、开发实例代码:(实例代码)ParseJPEG_withOCR.java 4.CloseWin.exe是销毁本sdk调用dll...
Asprise OCR 5.01,去除试用对话框,aocr.dll 使用: private const string OCR_DLL_NAME_32 = "aocr.dll";...官方下载:http://asprise.com/royalty-free-library/ocr-api-for-java-csharp-vb.net.html