迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java OCR

作者:迹忆客 最近更新:2023/07/16 浏览次数:

本文介绍了 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的应用可以分为以下几点:

  1. 对图像数据进行预处理,例如过滤、去偏斜和转换为灰度。
  2. 它还可以检测单词、线条和字符。
  3. 在后期过程中识别字符,根据语言数据中的置信度选择最佳字符,这些语言数据还包括语法、词典等。
  4. 它还可以根据训练数据集生成排名列表。

如何在 Java 中使用 OCR

请按照以下步骤在 Java 中使用 OCR:

  1. 首先,下载 Tess4j API。
  2. 提取下载的文件。
  3. 对于 OCR,我们必须在 IDE 中创建一个新项目。
  4. 创建新项目后,将 jar 文件导入到构建路径中。
  5. 您可以在 .\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 的优点:

  1. 它有助于提高办公室和其他地方的工作效率。
  2. OCR 可确保内容完整,节省时间。
  3. tesseract OCR 可以立即搜索给定的内容,这非常有用。
  4. 节省了工人的体力劳动。

OCR 的缺点是:

  1. OCR 仅限于语言识别。
  2. 此 OCR 不能提供 100% 的内容准确性。
  3. 此 OCR 需要花费大量精力来创建训练器数据。
  4. OCR 的性能基于图像,因此我们可能需要对图像进行额外处理以获得更好的结果。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 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 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便