📜  使用Java的 Tesseract OCR 和示例

📅  最后修改于: 2022-05-13 01:54:43.606000             🧑  作者: Mango

使用Java的 Tesseract OCR 和示例

在本文中,我们将学习如何使用Tesseract API在Java中使用 Tesseract OCR。

什么是正方体 OCR?
Tesseract OCR 是惠普实验室1985 年开发并于 2005 年开源的光学字符读取引擎。自 2006 年起由 Google 开发。 Tesseract 支持 Unicode (UTF-8),可以“开箱即用”识别 100 多种语言,因此也可以用于构建不同的语言扫描软件。最新的 Tesseract 版本是Tesseract 4 。它添加了一个新的基于神经网络 (LSTM) 的 OCR 引擎,该引擎专注于行识别,但仍然支持通过识别字符模式工作的传统 Tesseract OCR 引擎。

OCR 是如何工作的?

通常 OCR 的工作方式如下:

  1. 对图像数据进行预处理,例如:转灰度、平滑、去歪斜、过滤。
  2. 检测线条、单词和字符。
  3. 根据经过训练的数据集生成候选字符的排名列表。 (这里的 setDataPath() 方法用于设置 trainer 数据的路径)
  4. 后处理识别字符,根据上一步的置信度和语言数据选择最佳字符。语言数据包括字典、语法规则等。

好处

OCR 的优点很多,但分别是:

  • 它提高了办公室工作的效率和有效性
  • 即时搜索内容的能力非常有用,尤其是在必须处理大量扫描或大量文档流入的办公室环境中。
  • OCR 可以快速确保文档的内容保持完整,同时还可以节省时间。
  • 由于员工不再需要在体力劳动上浪费时间,并且可以更快、更高效地工作,因此工作流程有所增加。

缺点

  • OCR 仅限于语言识别。
  • 制作不同语言的培训师数据并实施它需要付出很多努力。
  • 人们还需要在图像处理方面做额外的工作,因为它是 OCR 性能最重要的部分。
  • 在做了这么多工作之后,没有任何 OCR 可以提供 100% 的准确率,即使在 OCR 之后,我们也必须通过机器学习的相邻方法来确定无法识别的字符或手动纠正它。

如何使用正方体 OCR

  1. 第一步是从链接下载 Tess4J API
  2. 从下载的文件中提取文件
  3. 打开你的 IDE 并创建一个新项目
  4. 将 jar 文件与您的项目链接。请参阅此链接。
  5. 请通过此路径“..\Tess4J-3.4.8-src\Tess4J\dist”迁移。

现在您已完成项目中的链接 jar 并准备使用 tesseract 引擎。

对清晰图像执行 OCR

现在您已经链接了 jar 文件,我们可以开始我们的编码部分了。以下代码读取图像文件并执行 OCR 并在控制台上显示文本。

Java
import java.io.File;
  
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
  
public class Test {
    public static void main(String[] args)
    {
        Tesseract tesseract = new Tesseract();
        try {
  
            tesseract.setDatapath("D:/Tess4J/tessdata");
  
            // the path of your tess data folder
            // inside the extracted file
            String text
                = tesseract.doOCR(new File("image.jpg"));
  
            // path of your image file
            System.out.print(text);
        }
        catch (TesseractException e) {
            e.printStackTrace();
        }
    }


Java
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 ScanedImage {
  
    public static void
    processImg(BufferedImage ipimage,
               float scaleFactor,
               float offset)
        throws IOException, TesseractException
    {
        // Making an empty image buffer
        // to store image later
        // ipimage is an image buffer
        // of input image
        BufferedImage opimage
            = new BufferedImage(1050,
                                1024,
                                ipimage.getType());
  
        // creating a 2D platform
        // on the buffer image
        // for drawing the new image
        Graphics2D graphic
            = opimage.createGraphics();
  
        // drawing new image starting from 0 0
        // of size 1050 x 1024 (zoomed images)
        // null is the ImageObserver class object
        graphic.drawImage(ipimage, 0, 0,
                          1050, 1024, null);
        graphic.dispose();
  
        // rescale OP object
        // for gray scaling images
        RescaleOp rescale
            = new RescaleOp(scaleFactor, offset, null);
  
        // performing scaling
        // and writing on a .png file
        BufferedImage fopimage
            = rescale.filter(opimage, null);
        ImageIO
            .write(fopimage,
                   "jpg",
                   new File("D:\\Tess4J\\Testing and learning\\output.png"));
  
        // Instantiating the Tesseract class
        // which is used to perform OCR
        Tesseract it = new Tesseract();
  
        it.setDatapath("D:\\Program Files\\Workspace\\Tess4J");
  
        // doing OCR on the image
        // and storing result in string str
        String str = it.doOCR(fopimage);
        System.out.println(str);
    }
  
    public static void main(String args[]) throws Exception
    {
        File f
            = new File(
                "D:\\Tess4J\\Testing and learning\\Final Learning Results\\input.jpg");
  
        BufferedImage ipimage = ImageIO.read(f);
  
        // getting RGB content of the whole image file
        double d
            = ipimage
                  .getRGB(ipimage.getTileWidth() / 2,
                          ipimage.getTileHeight() / 2);
  
        // comparing the values
        // and setting new scaling values
        // that are later on used by RescaleOP
        if (d >= -1.4211511E7 && d < -7254228) {
            processImg(ipimage, 3f, -10f);
        }
        else if (d >= -7254228 && d < -2171170) {
            processImg(ipimage, 1.455f, -47f);
        }
        else if (d >= -2171170 && d < -1907998) {
            processImg(ipimage, 1.35f, -10f);
        }
        else if (d >= -1907998 && d < -257) {
            processImg(ipimage, 1.19f, 0.5f);
        }
        else if (d >= -257 && d < -1) {
            processImg(ipimage, 1f, 0.5f);
        }
        else if (d >= -1 && d < 2) {
            processImg(ipimage, 1f, 0.35f);
        }
    }
}


对不清晰的图像执行 OCR

请注意,上面选择的图像实际上非常清晰和灰度,但在大多数情况下不会发生这种情况。在大多数情况下,我们得到一个嘈杂的图像,因此是一个非常爱管闲事的输出。为了处理它,我们需要对图像进行一些处理,称为图像处理

当前景文本与背景的分割非常清晰时,Tesseract 效果最佳。在实践中,保证良好的分割可能极具挑战性。如果图像在背景上有噪点,您可能无法从 Tesseract 获得高质量输出的原因有多种。从图像中去除噪声属于图像处理的一部分。为此,我们需要知道应该以何种方式处理图像。

您可以参考这篇文章详细了解如何提高准确性。为了在Java中实现相同的功能,我们将制作一个基于智能的小型模型,它将扫描图像的 RGB 内容,然后将其转换为灰度内容,并且我们还将对图像执行一些缩放效果。

下面的示例是关于如何根据其 RGB 内容对图像进行灰度化的示例代码。因此,如果图像非常暗,则它们会变得更亮和更清晰,如果图像发白,则将它们缩放到几乎没有暗对比度,以便文本可见。

Java

05221859