2.Java OCR 图像智能字符识别技术,可识别中文
几天一直在研究OCR技术,据我了解的情况,国内最专业的OCR软件只有2家,清华TH-OCR和汉王OCR,看了很多的OCR
技术发现好多对英文与数字的支持都很好,可惜很多都不支持中文字符。Asprise-OCR,Tesseract 3.0以前的版本
,都不支持中文,其实我用了下Asprise-OCR算是速度比较的快了,可惜他鄙视中文,这个没有办法,正好这段时间
知名的开源OCR引擎Tesseract 3.0版本发布了,他给我们带来的好消息就是支持中文,相关的下载项目网站是:
http://code.google.com/p/tesseract-ocr
虽然速度不是很客观可是毕竟人家开始支持中文也算是不错的,一个英文的语言包大概是1.8M,中文简体的语言包是
39.5M,中文繁体的语言包是53M,这样就知道为什么识别中文慢的原因了
----------------------------------------------------------------------
利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
但却很少看到在windows下的相关文章介绍。
接下来我将一步步讲述如何采用tesseract-ocr识别含有中文的图片。
1、下载tesseract-ocr(注意3.0版本之后才支持中文的识别)
tesseract-ocr-setup-3.00.exe
chi_sim.traineddata.gz
2、安装tesseract-ocr
解压缩,双击 tesseract-ocr-setup-3.00.exe 即可根据提示一步步安装,本人安装的目录是:D:/Program
Files/Tesseract-OCR
在该目录下可看到tesseract.exe文件,这就是我们后面程序中会调用到的运行进程。
3、自定义安装语言包
D:/Program Files/Tesseract-OCR目录下找到/tessdata目录,其是用来存放语言包,可把
chi_sim.traineddata.gz 解压缩之后的chi_sim.traineddata文件复制到该目录下即可。
4、编写测试代码
在编写代码之前下载两个jar包:jai_imageio-1.1-alpha.jar、swingx-1.0.jar,可在www.findjar.com
网站上去下载。
----------------------------------------------------------------------------------
下面是自己测试用的所有代码:
---------------------------------
1.新建项目:javaocr2
-------------------------
/javaocr2/src/com/credream/ocr/ImageFilter.java
package com.credream.ocr;
import java.awt.Graphics2D;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* 图像过滤,增强OCR识别成功率
*
*/
public class ImageFilter {
protected transient final Logger logger = LoggerFactory.getLogger(this.getClass());
private BufferedImage image;
private int iw, ih;
private int[] pixels;
public ImageFilter(BufferedImage image) {
this.image = image;
iw = image.getWidth();
ih = image.getHeight();
pixels = new int[iw * ih];
}
/** 图像二值化 */
public BufferedImage changeGrey() {
PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
try {
pg.grabPixels();
} catch (InterruptedException e) {
logger.error("异常:", e);
}
// 设定二值化的域值,默认值为100
int grey = 100;
// 对图像进行二值化处理,Alpha值保持不变
ColorModel cm = ColorModel.getRGBdefault();
for (int i = 0; i < iw * ih; i++) {
int red, green, blue;
int alpha = cm.getAlpha(pixels[i]);
if (cm.getRed(pixels[i]) > grey) {
red = 255;
} else {
red = 0;
}
if (cm.getGreen(pixels[i]) > grey) {
green = 255;
} else {
green = 0;
}
if (cm.getBlue(pixels[i]) > grey) {
blue = 255;
} else {
blue = 0;
}
pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
}
// 将数组中的象素产生一个图像
return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih,
pixels, 0, iw));
}
/** 提升清晰度,进行锐化 */
public BufferedImage sharp() {
PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
try {
pg.grabPixels();
} catch (InterruptedException e) {
logger.error("异常:", e);
}
// 象素的中间变量
int tempPixels[] = new int[iw * ih];
for (int i = 0; i < iw * ih; i++) {
tempPixels[i] = pixels[i];
}
// 对图像进行尖锐化处理,Alpha值保持不变
ColorModel cm = ColorModel.getRGBdefault();
for (int i = 1; i < ih - 1; i+