Java OCR
本文介绍了 OCR 在 Java 中的实现。
Java OCR
OCR 或 Tesseract OCR 是 HP 实验室于 1985 年开发的光学字符读取引擎,自 2006 年起由 Google 开发。 tesseract OCR 在 Unicode UTF-8 支持上运行,可以检测 100 多种语言,这就是它被用来创建语言扫描软件的原因。
最新的 Tesseract OCR 是 tesseract 版本 4,其中包括基于 OCR 的神经网络系统 LSTM,用于线条识别。 tesseract OCR 提供了使用 Java 中的 AI 和机器学习执行图像处理的功能。
OCR应用
OCR的应用可以分为以下几点:
- 对图像数据进行预处理,例如过滤、去偏斜和转换为灰度。
- 它还可以检测单词、线条和字符。
- 在后期过程中识别字符,根据语言数据中的置信度选择最佳字符,这些语言数据还包括语法、词典等。
- 它还可以根据训练数据集生成排名列表。
如何在 Java 中使用 OCR
请按照以下步骤在 Java 中使用 OCR:
- 首先,下载 Tess4j API。
- 提取下载的文件。
- 对于 OCR,我们必须在 IDE 中创建一个新项目。
- 创建新项目后,将 jar 文件导入到构建路径中。
-
您可以在
.\Tess4J-3.4.8-src\Tess4J\dist
路径中找到该 jar 文件。
如果上述方法不起作用,请将下载的文件解压到某处,进入 Eclipse,选择 Open Project from File System 选项,然后选择解压文件夹的路径。
这将直接在 Eclipse 中打开 tess4j OCR 项目,然后我们将添加类来创建我们的应用程序。
让我们尝试一个使用 Java 中的 tesseract OCR 进行图像到文本转换的简单示例。
package tess4jtest;
import java.io.File ;
import net.sourceforge.tess4j.Tesseract ;
import net.sourceforge.tess4j.TesseractException ;
public class test {
public static void main( String[ ] args ) {
// Instance of tesseract
Tesseract DemoTesseract = new Tesseract( ) ;
try {
// path to the tessdata in the extracted folder
DemoTesseract.setDatapath("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\tessdata") ;
// InputPath
String OutputText = DemoTesseract.doOCR(new File("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\sample.png" ) ) ;
System.out.print(OutputText) ;
}
catch (TesseractException ex) {
ex.printStackTrace( ) ;
}
}
}
上面的代码将从下图中读取文本:
让我们看看上面代码的输出。
Demmck is a resource for everyone interested in programming. embedded software, and electronics. It
covers the programming languages like Python‘ CIC++‘ ct and so on in mi: website’sfirstdevelopment
smge. Openrsource hardware alsofalls in the website's scope, like Arduino‘ Raspberry PL and BeagleBone.
Demmckaims to provide tutorials, howito's, and cheat sheets to different levels of developers and
hobbyists
正如我们所看到的,由于 OCR 尝试读取图像,图像的某些输出发生了变化。 现在让我们在以下手写示例中尝试相同的示例:
更改这行代码:
String OutputText = DemoTesseract.doOCR(new File("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\sample.png" )) ;
为
String OutputText = DemoTesseract.doOCR(new File("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\sample1.png" )) ;
现在,上述手写图像代码的输出如下。
This Is a handwr.' ++en
Exampte
NrHC as good as X" "Cam.
上面的图像都算清晰了,如果有不清晰的图像怎么办? 为了对不清晰的图像进行OCR识别,我们需要先对图像进行处理; 让我们尝试一个例子。
package tess4jtest;
import java.awt.Graphics2D;
import net.sourceforge.tess4j.*;
import java.awt.Image;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
public class test {
public static void ImageProcess(BufferedImage Input_Image, float scaleFactor, float offset) throws IOException, TesseractException {
// First of all, create an empty image buffer
BufferedImage Output_Image = new BufferedImage(1050, 1024, Input_Image.getType());
// Now create a 2D platform
Graphics2D DemoGraphic = Output_Image.createGraphics();
// draw a new image
DemoGraphic.drawImage(Input_Image, 0, 0, 1050, 1024, null);
DemoGraphic.dispose();
// rescale the OP object for the grey images
RescaleOp RescaleImage = new RescaleOp(scaleFactor, offset, null);
// perform scaling
BufferedImage Buffered_FOP_Image = RescaleImage.filter(Output_Image, null);
ImageIO.write(Buffered_FOP_Image, "jpg", new File("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\output\\output.png"));
Tesseract DemoTesseract = new Tesseract();
DemoTesseract.setDatapath("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\tessdata");
String OutputStr = DemoTesseract.doOCR(Buffered_FOP_Image);
System.out.println(OutputStr);
}
public static void main(String args[]) throws Exception {
File InputFile = new File( "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\New folder (3)\\Tess4J\\sample2.png");
BufferedImage Input_Image = ImageIO.read(InputFile);
double Image_Double = Input_Image.getRGB(Input_Image.getTileWidth() / 2, Input_Image.getTileHeight() / 2);
// compare the values
if (Image_Double >= -1.4211511E7 && Image_Double < -7254228) {
ImageProcess(Input_Image, 3f, -10f);
}
else if (Image_Double >= -7254228 && Image_Double < -2171170) {
ImageProcess(Input_Image, 1.455f, -47f);
}
else if (Image_Double >= -2171170 && Image_Double < -1907998) {
ImageProcess(Input_Image, 1.35f, -10f);
}
else if (Image_Double >= -1907998 && Image_Double < -257) {
ImageProcess(Input_Image, 1.19f, 0.5f);
}
else if (Image_Double >= -257 && Image_Double < -1) {
ImageProcess(Input_Image, 1f, 0.5f);
}
else if (Image_Double >= -1 && Image_Double < 2) {
ImageProcess(Input_Image, 1f, 0.35f);
}
}
}
上面的代码将首先处理有噪声的图像,然后尝试读取图像文本。 此代码使用的图像如下。
查看输出:
I liVEI'» 1W,
Every :10 I 0
£0 Workyéy git;
A/Jo T would
M: £0 visié MW
OCR 的优点和缺点
以下是在 Java 中使用 OCR 的优点:
- 它有助于提高办公室和其他地方的工作效率。
- OCR 可确保内容完整,节省时间。
- tesseract OCR 可以立即搜索给定的内容,这非常有用。
- 节省了工人的体力劳动。
OCR 的缺点是:
- OCR 仅限于语言识别。
- 此 OCR 不能提供 100% 的内容准确性。
- 此 OCR 需要花费大量精力来创建训练器数据。
- OCR 的性能基于图像,因此我们可能需要对图像进行额外处理以获得更好的结果。
相关文章
如何在 Java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,