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 中对一个 Switch Case 语句使用多个值
发布时间:2023/07/16 浏览次数:174 分类:Java
-
在本文中,我们将学习如何在一个 switch-case 语句中使用多个值。使用 switch-case 语句 Java 允许程序员通过使用 switch case 语句来像其他编程语言一样克服太多的 if-else 条件语句。
Java 中的线程安全延迟初始化
发布时间:2023/07/16 浏览次数:59 分类:Java
-
本文将讨论在 Java 中实现线程安全的延迟初始化。Java 中的对象初始化 延迟初始化是延迟对象创建的行为。 它还可能导致某些计算任务或首次昂贵流程的延迟。
在 Java 中显示动画 GIF
发布时间:2023/07/16 浏览次数:112 分类:Java
-
我们可以使用javax包的Swing库方法来在Java中显示动画GIF。 本文介绍用户如何在 Java 应用程序或单独的窗口中显示动画 GIF。使用 Javax.swing 库在 Java 中显示动画 GIF
在 Java 中用 %20 替换空格
发布时间:2023/07/16 浏览次数:96 分类:Java
-
在本文中,我们将学习两种用 %20 替换给定字符串的所有空格的方法。Java中使用replaceAll()方法将空格替换为%20 在这里,我们使用Java内置方法 replaceAll() 将所有空格替换为%20字符串。
Java 中的矩阵乘法
发布时间:2023/07/16 浏览次数:99 分类:Java
-
在本文中,我们将学习在 Java 中将两个矩阵相乘。Java 中两个矩阵相乘 我们使用乘法和加法运算符来乘两个矩阵。
Java Synchronised变量
发布时间:2023/07/16 浏览次数:131 分类:Java
-
本文将讨论如何在Java中同步或锁定变量。同步或锁定是避免此类错误情况的解决方案。 synchronized 关键字
Java最快的排序算法
发布时间:2023/07/16 浏览次数:155 分类:Java
-
本文将介绍两种最快的排序算法并用 Java 编写它们的代码。第一种技术是计数排序,它有一些局限性。 因此,我们还将介绍合并排序算法。 Java中的计数排序算法 Java中的归并排序算法
在 Java 中将毫秒转换为分钟和秒
发布时间:2023/07/16 浏览次数:140 分类:Java
-
本文介绍了Java中将毫秒转换为分钟和秒的三种不同方法,我们将通过示例代码一一了解。使用 java.util.concurrent 包将毫秒转换为分钟和秒 java.util 库的并发包包含 TimeUnit 类来管理 Java 中的时间。
重新启动 Java 程序
发布时间:2023/07/16 浏览次数:118 分类:Java
-
在菜单驱动的程序或游戏中,我们需要一个选项来重新启动或重置我们的程序。 我们可以通过递归调用函数或使用条件循环语句来重新启动Java中的程序。使用 do-while 条件语句