图片转文字-Tesseract-OCR,完成文字转换。

Tesseract-OCR

        在图像文字识别领域,Tesseract OCR 是一款广受欢迎的开源工具,通过结合 Java 语言可以实现强大的 OCR 功能。本文将围绕 Tesseract OCR 在 Java 中的应用,以及如何解决识别准确性问题展开讨论。

优点

开源免费:代码可自由获取、修改和分发,无需支付授权费用,降低了开发成本。

多语言支持:支持多种语言的文字识别,通过下载相应的语言包,就能够对不同语言的文本进行识别。

可定制性强:调整识别参数、训练自己的字库模型,以优化在特定场景下的识别效果,如识别特定字体、字号或具有特定格式的文档。

识别准确率较高:经过不断的优化和训练,对于常规的印刷体文字,在图像质量较好的情况下,能够达到较高的识别准确率。

缺点

对图像质量要求较高:如果图像存在模糊、倾斜、噪声干扰、低分辨率等问题,可能会显著影响识别准确率。

复杂布局和特殊字体处理能力有限:复杂排版布局的文档,以及一些罕见的手写字体或艺术字体,会出现文字分割错误或识别不准确的情况。

缺乏直观的图形界面:Tesseract 主要通过命令行或编程接口来使用,对于不熟悉命令行操作或编程的用户来说,使用门槛较高。

一、安装 Tesseract OCR 引擎

1.3、Windows

从 Tesseract  Home · UB-Mannheim/tesseract Wiki · GitHub下载安装程序,按照提示完成安装。

1.2、Linux

使用包管理器进行安装,例如在 Ubuntu 上可以运行 sudo apt-get install tesseract-ocr。

1.3、macOS

可以使用 Homebrew 进行安装,运行 brew install tesseract

在 macOS 系统中,通过brew install tesseract安装 Tesseract OCR 引擎后,其默认安装路径通常是/usr/local/Cellar/tesseract。

你可以通过以下命令来确认具体路径:

brew --prefix tesseract

借助 Homebrew 安装 Tesseract 之后,tessdata目录通常位于/usr/local/share/tessdata。你可以使用以下命令来查看该目录是否存在,以及chi_sim.traineddata文件是否存在.

要是文件不存在,你需要手动下载 chi_sim.traineddata 文件。可以从 Tesseract OCR 的 GitHub 仓库下载GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the "best" LSTM models + legacy models 

,然后把下载好的文件放到 /usr/local/share/tessdata 目录。

二、添加 Tess4J 依赖

如果你使用 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.11.0</version>
</dependency>

三、编写 Java 代码

public class OCRExample {

    public static void main(String[] args) {

        // 创建 Tesseract 实例

        Tesseract tesseract = new Tesseract();

        try {

            // 设置 Tesseract 数据文件的路径,根据实际安装路径修改

            tesseract.setDatapath("C:\\Program Files\\Tesseract-OCR\\tessdata");

            // 设置识别语言,例如 "eng" 表示英文,"chi_sim" 表示简体中文

            tesseract.setLanguage("eng");

            // 要识别的图片文件路径,根据实际情况修改

            File imageFile = new File("path/to/your/image.jpg");

            // 进行 OCR 识别

            String result = tesseract.doOCR(imageFile);

            // 输出识别结果

            System.out.println(result);

        } catch (TesseractException e) {

            System.err.println("OCR 识别出错: " + e.getMessage());

        }

    }

}
  • 完善优化

基于 Tesseract OCR 的 Java 工具类,我们可以方便地在项目中实现图像格式处理和文字识别功能。在实际应用中,根据具体需求对工具类进行优化和拓展,能够更好地满足不同场景下的 OCR 需求。

4.1、图片格式转化

处理图像文件,判断格式并转换 jpg/jpeg 为 png.

/**
     * 处理图像文件,判断格式并转换 jpg/jpeg 为 png
     * @param inputFilePath 输入文件的路径
     * @return 处理后的文件路径,如果不支持的格式则返回 null
     */
    public static Map<String ,Object> processImageFile(String inputFilePath) {
        Map<String, Object> resultMap = new HashMap<>();
        // 图片转化后的存储位置
        String outputDirectory = "/Users/admin/Downloads/WORK/JAVA/Upload/ocr";
        File inputFile = new File(inputFilePath);
        try {
            BufferedImage image = ImageIO.read(inputFile);
            String outputFileName = removeExtension(inputFile.getName()) + ".png";
            File outputFile = new File(outputDirectory, outputFileName);
            // 将图像写入为 PNG 格式
            ImageIO.write(image, "png", outputFile);
            resultMap.put("code", 0);
            resultMap.put("msg", "转化成功.");
            resultMap.put("url", outputFile.getAbsolutePath());
        } catch (IOException e) {
            resultMap.put("code", 400);
            resultMap.put("msg", "转换文件格式时出错.");
        }
        return resultMap;
    }

4.2、文件格式处理

/**
     * 获取文件的扩展名
     * @param fileName 文件名
     * @return 文件扩展名
     */
    public static String getFileExtension(String fileName) {
        int lastIndex = fileName.lastIndexOf('.');
        if (lastIndex == -1) {
            return "";
        }
        return fileName.substring(lastIndex + 1);
    }

    /**
     * 移除文件名的扩展名
     * @param fileName 文件名
     * @return 移除扩展名后的文件名
     */
    private static String removeExtension(String fileName) {
        int lastIndex = fileName.lastIndexOf('.');
        if (lastIndex == -1) {
            return fileName;
        }
        return fileName.substring(0, lastIndex);
    }

    /**
     * 检查文件格式是否允许
     * @param fileExtension 文件扩展名
     * @return 如果允许则返回 true,否则返回 false
     */
    public static boolean isAllowedFormat(String fileExtension) {
        return "jpg".equals(fileExtension) || "jpeg".equals(fileExtension) || "png".equals(fileExtension);
    }

4.3、文字转换

public static String performOCR(String resultFilePath) {
        // ocr转换
        Tesseract tesseract = new Tesseract();
        try {
            // 设置 Tesseract 数据文件的路径,根据实际安装路径修改
            tesseract.setDatapath(tessDataUrl);
            // 设置识别语言,例如 "eng" 表示英文,"chi_sim" 表示简体中文
            tesseract.setLanguage("chi_sim+eng"); // 支持中英文混合识别
            // 要识别的图片文件路径,根据实际情况修改
            File imageFile = new File(resultFilePath);
            // 配置 Tesseract 以提高识别准确性
            tesseract.setPageSegMode(6); // 设置页面分割模式为单个统一文本块
            tesseract.setOcrEngineMode(1); // 使用 LSTM OCR 引擎
            // 进行 OCR 识别
            String result = tesseract.doOCR(imageFile);
            // 去除多余的空格和换行符
            result = result.replaceAll("\\s+", " ").trim();
            // 输出识别结果
            return AjaxResult.Return(0, result);
        } catch (TesseractException e) {
            return AjaxResult.Return(400, "OCR 识别出错: " + e.getMessage());
        }
    }

4.4、结合业务使用

package com.cn.springboot.controller;

import com.cn.springboot.utils.AjaxResult;
import com.cn.springboot.utils.OCRUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Map;

@RestController
@RequestMapping(value={"/ocr"},method = {RequestMethod.POST,RequestMethod.GET})
public class OcrController {

    @RequestMapping("/ocrUpload")
    public String ocrUpload(@RequestParam("ocrFile") MultipartFile ocrFile, HttpServletRequest request) {
        try {
            // 检查文件是否为空
            if (ocrFile.isEmpty()) {
                return AjaxResult.Return(400, "上传的文件为空.");
            }
            // 获取上传文件的原始文件名
            String originalFileName = ocrFile.getOriginalFilename();
            if (originalFileName == null) {
                return AjaxResult.Return(400, "无法获取上传文件的原始文件名.");
            }
            // 获取上传文件的扩展名
            String fileExtension = OCRUtil.getFileExtension(originalFileName);
            if (!OCRUtil.isAllowedFormat(fileExtension)) {
                return "不支持的文件格式,仅允许上传 jpg、jpeg、png 文件";
            }
            // 创建临时文件
            File tempFile = File.createTempFile("upload_", null);
            ocrFile.transferTo(tempFile);
            // 获取临时文件的绝对路径
            String inputFilePath = tempFile.getAbsolutePath();
            // 图片判定或转换并输出结果
            Map<String, Object> map = OCRUtil.processImageFile(inputFilePath);
            if (!map.get("code").toString().equals("0")) {
                // 删除临时文件
                tempFile.delete();
                return AjaxResult.Return(400, map.get("msg").toString());
            }
            tempFile.delete();
            // 进行 OCR 识别
            return OCRUtil.performOCR(map.get("url").toString());
        } catch (Exception ex) {
            ex.printStackTrace();
            return AjaxResult.Return(400,"请求异常:"+ex.getMessage());
        }
    }

}

4.5、设置语言包

TESS_DATA_URL=/usr/local/share/tessdata

五、常见问题

5.1、Error: LSTM requested, but not present!! Loading tesseract.

在使用过程中,我们还遇到了 Error: LSTM requested, but not present!! Loading tesseract. 错误。该错误是由于请求使用 LSTM 引擎,但系统中未安装或配置该引擎导致的。解决方法包括检查并更新 Tesseract 版本(确保使用支持 LSTM 的版本,如 4.0 及以上),检查并下载 LSTM 数据文件并正确配置路径,以及检查代码中对 Tesseract 引擎模式的配置是否正确。

5.2、Not a JPEG file: starts with 0x89 0x50 

这个错误信息表明程序在处理文件时预期该文件是 JPEG 格式,但实际检测到的文件头并非 JPEG 格式的文件头,而是 PNG 格式的文件头。

六、总结

通过对 Tesseract OCR 在 Java 中的应用及识别准确性优化的实践,我们发现 OCR 识别准确性受到多种因素的影响,包括图像预处理、Tesseract 配置等。在实际应用中,需要根据具体情况不断调整和优化,以达到更好的识别效果。同时,对于遇到的错误要及时排查和解决,确保 OCR 功能的正常运行。

通过以上内容便可轻轻松松完成图片转文字.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值