package com.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;
/**
*
* 图像过滤,增强OCR识别成功率
*
*/
public class ImageFilter {
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) {
e.printStackTrace();
}
// 设定二值化的域值,默认值为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) {
e.printStackTrace();
}
// 象素的中间变量
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++) {
for (int j = 1; j < iw - 1; j++) {
int alpha = cm.getAlpha(pixels[i * iw + j]);
// 对图像进行尖锐化
int red6 = cm.getRed(pixels[i * iw + j + 1]);
int red5 = cm.getRed(pixels[i * iw + j]);
int red8 = cm.getRed(pixels[(i + 1) * iw + j]);
int sharpRed = Math.abs(red6 - red5) + Math.abs(red8 - red5);
int green5 = cm.getGreen(pixels[i * iw + j]);
int green6 = cm.getGreen(pixels[i * iw + j + 1]);
int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);
int sharpGreen = Math.abs(green6 - green5) + Math.abs(green8 - green5);
int blue5 = cm.getBlue(pixels[i * iw + j]);
int blue6 = cm.getBlue(pixels[i * iw + j + 1]);
int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);
int sharpBlue = Math.abs(blue6 - blue5) + Math.abs(blue8 - blue5);
if (sharpRed > 255) {
sharpRed = 255;
}
if (sharpGreen > 255) {
sharpGreen = 255;
}
if (sharpBlue > 255) {
sharpBlue = 255;
}
tempPixels[i * iw + j] = alpha << 24 | sharpRed << 16 | sharpGreen << 8 | sharpBlue;
}
}
// 将数组中的象素产生一个图像
return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, tempPixels, 0, iw));
}
/** 中值滤波 */
public BufferedImage median() {
PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 对图像进行中值滤波,Alpha值保持不变
ColorModel cm = ColorModel.getRGBdefault();
for (int i = 1; i < ih - 1; i++) {
for (int j = 1; j < iw - 1; j++) {
int red, green, blue;
int alpha = cm.getAlpha(pixels[i * iw + j]);
// int red2 = cm.getRed(pixels[(i - 1) * iw + j]);
int red4 = cm.getRed(pixels[i * iw + j - 1]);
int red5 = cm.getRed(pixels[i * iw + j]);
int red6 = cm.getRed(pixels[i * iw + j + 1]);
// int red8 = cm.getRed(pixels[(i + 1) * iw + j]);
// 水平方向进行中值滤波
if (red4 >= red5) {
if (red5 >= red6) {
red = red5;
} else {
if (red4 >= red6) {
red = red6;
} else {
red = red4;
}
}
} else {
if (red4 > red6) {
red = red4;
} else {
if (red5 > red6) {
red = red6;
} else {
red = red5;
}
}
}
// int green2 = cm.getGreen(pixels[(i - 1) * iw + j]);
int green4 = cm.getGreen(pixels[i * iw + j - 1]);
int green5 = cm.getGreen(pixels[i * iw + j]);
int green6 = cm.getGreen(pixels[i * iw + j + 1]);
// int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);
// 水平方向进行中值滤波
if (green4 >= green5) {
if (green5 >= green6) {
green = green5;
} else {
if (green4 >= green6) {
green = green6;
} else {
green = green4;
}
}
} else {
if (green4 > green6) {
green = green4;
} else {
if (green5 > green6) {
green = green6;
} else {
green = green5;
}
}
}
// int blue2 = cm.getBlue(pixels[(i - 1) * iw + j]);
int blue4 = cm.getBlue(pixels[i * iw + j - 1]);
int blue5 = cm.getBlue(pixels[i * iw + j]);
int blue6 = cm.getBlue(pixels[i * iw + j + 1]);
// int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);
// 水平方向进行中值滤波
if (blue4 >= blue5) {
if (blue5 >= blue6) {
blue = blue5;
} else {
if (blue4 >= blue6) {
blue = blue6;
} else {
blue = blue4;
}
}
} else {
if (blue4 > blue6) {
blue = blue4;
} else {
if (blue5 > blue6) {
blue = blue6;
} else {
blue = blue5;
}
}
}
pixels[i * iw + j] = alpha << 24 | red << 16 | green << 8 | blue;
}
}
// 将数组中的象素产生一个图像
return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
}
/** 线性灰度变换 */
public BufferedImage lineGrey() {
PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 对图像进行进行线性拉伸,Alpha值保持不变
ColorModel cm = ColorModel.getRGBdefault();
for (int i = 0; i < iw * ih; i++) {
int alpha = cm.getAlpha(pixels[i]);
int red = cm.getRed(pixels[i]);
int green = cm.getGreen(pixels[i]);
int blue = cm.getBlue(pixels[i]);
// 增加了图像的亮度
red = (int) (1.1 * red + 30);
green = (int) (1.1 * green + 30);
blue = (int) (1.1 * blue + 30);
if (red >= 255) {
red = 255;
}
if (green >= 255) {
green = 255;
}
if (blue >= 255) {
blue = 255;
}
pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
}
// 将数组中的象素产生一个图像
return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
}
/** 转换为黑白灰度图 */
public BufferedImage grayFilter() {
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
return op.filter(image, null);
}
/** 平滑缩放 */
public BufferedImage scaling(double s) {
AffineTransform tx = new AffineTransform();
tx.scale(s, s);
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
return op.filter(image, null);
}
public BufferedImage scale(Float s) {
int srcW = image.getWidth();
int srcH = image.getHeight();
int
没有合适的资源?快使用搜索试试~ 我知道了~
Java OCR 图像智能字符识别-文字识别Demo
共78个文件
jar:20个
exe:7个
class:7个
5星 · 超过95%的资源 需积分: 43 319 下载量 94 浏览量
2018-03-24
02:43:55
上传
评论 16
收藏 49.04MB RAR 举报
温馨提示
Java OCR 图像智能字符识别-文字识别Demo。能够识别中文
资源推荐
资源详情
资源评论
收起资源包目录
ORCDemo.rar (78个子文件)
ORCDemo
.project 907B
.settings
.jsdtscope 567B
org.eclipse.wst.common.component 473B
org.eclipse.jdt.core.prefs 364B
org.eclipse.wst.common.project.facet.core.xml 345B
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.wst.jsdt.ui.superType.name 6B
src
com
ocr
OCR.java 2KB
OCRUtil.java 5KB
Test.java 386B
ImageIOHelper.java 5KB
MyString.java 789B
ImageFilter.java 8KB
init
SYS.java 498B
build
classes
com
ocr
OCR.class 4KB
Test.class 940B
MyString.class 2KB
ImageFilter.class 7KB
ImageIOHelper.class 6KB
OCRUtil.class 8KB
init
SYS.class 858B
tesseract
training
unicharset_extractor.exe 24KB
mftraining.exe 163KB
cntraining.exe 65KB
wordlist2dawg.exe 125KB
combine_tessdata.exe 26KB
tessdata
chi_tra.traineddata 53.55MB
configs
logfile 25B
api_config 26B
inter 93B
digits 35B
box.train.stderr 374B
box.train 399B
makebox 26B
kannada 101B
unlv 95B
ambigs.train 62B
chi_sim.traineddata 39.51MB
tessconfigs
msdemo 403B
batch.nochop 37B
nobatch 1B
matdemo 243B
batch 50B
segdemo 308B
eng.traineddata 1.84MB
dlltest.exe 33KB
tessdll.lib 30KB
tessdll.dll 1.11MB
doc
COPYING 890B
eurotext.tif 100KB
ReleaseNotes 10KB
AUTHORS 170B
README 2KB
phototest.tif 38KB
leptonlib.dll 1.54MB
tesseract.exe 1.03MB
WebContent
WEB-INF
lib
commons-logging.jar 54KB
commons-lang-2.4.jar 256KB
piccolo2d-core-1.2.1.jar 81KB
javax.servlet-api-3.1.0.jar 94KB
swingx-0.9.5-2.jar 1.19MB
commons-logging-1.1.jar 52KB
commons-collections-3.2.jar 558KB
commons-lang.jar 237KB
sqljdbc.jar 570KB
json-lib-2.3-jdk15.jar 148KB
zsy.jar 55KB
commons-io-1.4.jar 106KB
commons-logging-4.0.6.jar 24KB
commons-lang-2.4-osgi.jar 258KB
dwr.jar 1.08MB
jdbcappender.jar 28KB
mysql-connector-java-5.1.7-bin.jar 693KB
jai_imageio-1.1-alpha.jar 729KB
jdom.jar 150KB
Log4j.jar 344KB
META-INF
MANIFEST.MF 39B
.classpath 2KB
共 78 条
- 1
12点一刻
- 粉丝: 35
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页