java识别图片上的文字、java中语言库tessdate的使用
- 下载语言库:tessdata语言库
- 下载好后,记住在本地路径:如: D:\tessdate\tessdata-main
- 添加 maven
<!--基于 Tesseract-OCR 封装的 OCR 识别 jar-->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.8.0</version>
</dependency>
- 识别代码:(识别一些简单的文字)
public static void main(String[] args) {
// 需要识别的图片路径
String imagePath = "C:/Users/Dell/Desktop/cc.jpg";
// 使用Tesseract进行OCR
Tesseract tesseract = new Tesseract();
// 设置Tesseract数据路径 上面下载的本地路径
tesseract.setDatapath("D:\\tessdate\\tessdata-main");
// 设置语言库 中文
tesseract.setLanguage("chi_sim");
try {
// 进行文字识别
String result = tesseract.doOCR(new File(imagePath));
System.out.println("OCR结果:");
System.out.println(result);
} catch (TesseractException e) {
e.printStackTrace();
}
}
识别结果如下
这样只能识别一些简单的文字,还可能会识别出错,想识别复杂一点的减少出错率需要配合上opencv 使用--如下:
- 添加maven
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.5.1-1.5.5</version>
</dependency>
处理图像(根据情况修改里面的参数,找到识别率最高的参数组。注:有的参数有最小最大值或单数双数限制,不正确时会报错,从错误信息就可以看出来):
public static Mat preprocessImage(String imagePath) {
// 1. 读取图像文件
// 使用 OpenCV 的 imread 函数从指定路径读取图像,返回一个 Mat 对象。
// Mat 是 OpenCV 中用于存储图像的基本数据结构。
Mat src = opencv_imgcodecs.imread(imagePath);
// 2. 转换为灰度图像
// 使用 cvtColor 函数将读取的图像从 BGR 格式转换为灰度图像。
// BGR 是 OpenCV 中默认的颜色格式,而灰度图像只有单一通道。
Mat gray = new Mat();
opencv_imgproc.cvtColor(src, gray, opencv_imgproc.COLOR_BGR2GRAY);
// 3. 去噪
// 使用 fastNlMeansDenoising 函数进行快速非局部均值去噪,主要用于减少图像中的噪声。
// 这个步骤可以提高图像的清晰度,尤其是在灰度图像的情况下。
Mat denoised = new Mat();
opencv_photo.fastNlMeansDenoising(gray, denoised);
// 4. 形态学操作去除背景纹路
// 使用 getStructuringElement 创建一个形态学操作的核 (kernel),它是一个 2x2 的矩形。
// 在形态学处理中,核用于在图像上执行膨胀、腐蚀等操作。
Mat morphKernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(2, 2));
// 使用 morphologyEx 进行形态学关闭操作 (MORPH_CLOSE),这是一种先膨胀后腐蚀的操作。
// 这种操作可以消除图像中的小空洞或细小的黑色区域,平滑图像中的边缘。
Mat morph = new Mat();
opencv_imgproc.morphologyEx(denoised, morph, opencv_imgproc.MORPH_CLOSE, morphKernel);
// 5. 自适应阈值处理(二值化)
// 使用 adaptiveThreshold 将形态学处理后的图像转换为二值图像。
// 自适应阈值会根据图像局部区域的亮度自动调整阈值,从而对亮度不均的图像效果更好。
// 参数说明:
// 255 是最大值,表示超过阈值的像素值将设为 255(白色)。
// ADAPTIVE_THRESH_GAUSSIAN_C 表示采用高斯滤波的方式来计算阈值。
// THRESH_BINARY 表示二值化处理,像素值要么为 0(黑色),要么为 255(白色)。
// 3 是 blockSize,表示用于计算阈值的邻域大小。
// 2 是一个常数,会从计算出来的阈值中减去,用来调整结果。
Mat binary = new Mat();
opencv_imgproc.adaptiveThreshold(morph, binary, 255, opencv_imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, opencv_imgproc.THRESH_BINARY, 3, 2);
// 6. 返回处理后的二值图像
return binary;
}
使用方法:
public static void main(String[] args) {
// 识别的图片路径
String imagePath = "C:/Users/Dell/Desktop/ee.jpeg";
// 获取处理后的图片
Mat processedImage = preprocessImage(imagePath);
// 保存预处理后的图像以便检查
File outputDir = new File("output");
if (!outputDir.exists()) {
outputDir.mkdirs(); // 创建目录及所需的父目录
}
// 保存处理后的图片 处理后的新图片路径
opencv_imgcodecs.imwrite("output/processed_image.jpg", processedImage);
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("D:\\tessdate\\tessdata-main");
tesseract.setLanguage("chi_sim");
try {
// 识别保存处理后的图片
String result = tesseract.doOCR(new File("output/processed_image.jpg"));
System.out.println("OCR结果:");
System.out.println(result);
} catch (TesseractException e) {
e.printStackTrace();
}
}