• Tess4J 简单使用入门


    参考:Tess4J 简单使用入门_一个爱浪费时间的人的博客-CSDN博客_tess4j

    一.简介

    Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。而Tess4J则是Tesseract在Java PC上的应用。在英文和数字识别中性能还是不错的,但是在中文识别中,无论速度还是识别率还是较弱,建议有条件的话,针对场景进行训练,会获得较好结果,本文仅对目前Tess4J的用法进行介绍

    二.入门教程

    2.1 Tess4J官网下载最新的源码包

    Tess4J官网.

    Github地址:GitHub - nguyenq/tess4j: Java JNA wrapper for Tesseract OCR API

    2.2 Tess4J目录说明

    • Tess4J目录:

    在这里插入图片描述

    • dist:综合jar,不需要配置dll
    • lib:所有相关的jar包
    • src:源码包
    • tessdata:训练好的字体模型
    • test:测试用例

    2.3 Java Maven Demo

    Pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>tess4j-demoartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. properties>
    14. <dependencies>
    15. <dependency>
    16. <groupId>net.sourceforge.tess4jgroupId>
    17. <artifactId>tess4jartifactId>
    18. <version>5.4.0version>
    19. dependency>
    20. <dependency>
    21. <groupId>junitgroupId>
    22. <artifactId>junit-departifactId>
    23. <version>4.11version>
    24. dependency>
    25. <dependency>
    26. <groupId>org.slf4jgroupId>
    27. <artifactId>slf4j-apiartifactId>
    28. <version>2.0.3version>
    29. dependency>
    30. dependencies>
    31. project>

    示例1

    设置引擎模式,设置识别语种,设置图片分割模式

    1. package org.example;
    2. import net.sourceforge.tess4j.ITesseract;
    3. import net.sourceforge.tess4j.Tesseract;
    4. import net.sourceforge.tess4j.TesseractException;
    5. import java.io.File;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. public class Main {
    9. public static void main(String[] args) throws TesseractException {
    10. System.out.println("Hello world!");
    11. File file = new File("D:\\1.jpg");
    12. ITesseract iTesseract = new Tesseract();
    13. iTesseract.setDatapath("D:\\programs\\TessractOCR\\tessdata"); // 设置tessdata目录
    14. iTesseract.setLanguage("eng"); // 指定需要识别的语种
    15. // 只提取数字
    16. List configList = new ArrayList<>();
    17. configList.add("digits");
    18. iTesseract.setConfigs(configList);
    19. iTesseract.setOcrEngineMode(1); // 设置OCR引擎模式(OEM)
    20. iTesseract.setPageSegMode(6); // 设置图片分割模式(PSM)
    21. String result = iTesseract.doOCR(file);
    22. System.out.println(result);
    23. }
    24. }
    • 其中模型数据就在tessdata目录下

    在这里插入图片描述

    示例2

    对待识别图片进行预处理,便于识别 

    1. package org.example;
    2. import net.sourceforge.tess4j.ITesseract;
    3. import net.sourceforge.tess4j.Tesseract;
    4. import net.sourceforge.tess4j.TesseractException;
    5. import net.sourceforge.tess4j.util.ImageHelper;
    6. import javax.imageio.ImageIO;
    7. import java.awt.image.BufferedImage;
    8. import java.io.File;
    9. import java.io.IOException;
    10. /**
    11. * 图片优化
    12. * @author 86133 2022-11-18 10:01:09
    13. */
    14. public class ImgOptimize {
    15. public static void main(String[] args) throws IOException {
    16. // 识别图片的文件(修改为自己的图片路径)
    17. String imagePath = ClassLoader.getSystemResource("tupian/9188.png").getPath();
    18. if (imagePath.length() > 0) {
    19. imagePath = imagePath.substring(1);
    20. }
    21. System.out.println("imagePath:" + imagePath);
    22. File file = new File(imagePath);
    23. // 图片转图片流
    24. BufferedImage img = ImageIO.read(file);
    25. // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
    26. img = ImageHelper.convertImageToGrayscale(img);
    27. // 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
    28. img = ImageHelper.convertImageToBinary(img);
    29. // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
    30. img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);
    31. ITesseract instance = new Tesseract();
    32. //设置训练库的位置
    33. String path = ClassLoader.getSystemResource("tessdata").getPath();
    34. if (path.length() > 0) {
    35. path = path.substring(1);
    36. }
    37. // 打印路径
    38. System.out.println("tessdata:" + path);
    39. instance.setDatapath(path);
    40. //chi_sim :简体中文, eng 根据需求选择语言库
    41. instance.setLanguage("eng");
    42. String result = null;
    43. try {
    44. long startTime = System.currentTimeMillis();
    45. result = instance.doOCR(img);
    46. long endTime = System.currentTimeMillis();
    47. System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
    48. } catch (TesseractException e) {
    49. e.printStackTrace();
    50. }
    51. System.out.println("result: " + result);
    52. }
    53. }

    说明: 

    1. // 基于图片识别的识别率不高,一般先做图片的处理再进行识别。Tess4J专门提供的ImageHelper:
    2. getScaledInstance 放大图片
    3. getSubImage 截取图片
    4. convertImageToBinary 转二进制
    5. convertImageToGrayscale 将图像转换为灰度
    6. invertImageColor 反转图像颜色
    7. rotateImage 旋转影像
    8. //图片转图片流
    9. BufferedImage img = ImageIO.read(file);
    10. // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
    11. img = ImageHelper.convertImageToGrayscale(img);
    12. // 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
    13. img = ImageHelper.convertImageToBinary(img);
    14. // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,
    15. // 但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
    16. img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);

    示例3 

    将识别后的文本,标识到图片中相应的识别位置上

    1. package org.example;
    2. import net.sourceforge.tess4j.*;
    3. import javax.imageio.ImageIO;
    4. import javax.imageio.stream.ImageOutputStream;
    5. import java.awt.*;
    6. import java.awt.image.BufferedImage;
    7. import java.io.File;
    8. import java.io.IOException;
    9. import java.nio.file.Files;
    10. import java.util.ArrayList;
    11. import java.util.Arrays;
    12. import java.util.List;
    13. /**
    14. * 图片文字识别,并将识别结果标识在图片上
    15. *
    16. * @author 86133 2022-11-17 15:04:18
    17. */
    18. public class ImgIdentification {
    19. public static void main(String[] args) throws IOException {
    20. File imageFile = new File("img/test.png");
    21. BufferedImage bi = ImageIO.read(Files.newInputStream(imageFile.toPath()));
    22. ITesseract instance = getInstance();
    23. // 获取识别的词汇列表
    24. List wordList = instance.getWords(bi, ITessAPI.TessPageIteratorLevel.RIL_WORD);
    25. System.out.println("wordList: ----------------- " + wordList);
    26. File outImageFile = new File("img/result.png");
    27. identifyImg(bi, wordList, outImageFile);
    28. }
    29. /**
    30. * 识别并标识图片
    31. *
    32. * @param wordList
    33. * @throws IOException
    34. */
    35. private static void identifyImg(BufferedImage bi, List wordList, File outImageFile) throws IOException {
    36. // 创建画笔
    37. Graphics2D pen = bi.createGraphics();
    38. pen.setColor(Color.RED);
    39. for (Word word : wordList) {
    40. Rectangle rect = word.getBoundingBox();
    41. pen.drawRect(rect.x, rect.y, rect.width, rect.height);
    42. pen.setFont(new Font("微软雅黑", Font.ITALIC, 18));
    43. pen.drawString(word.getText(), rect.x, rect.y - 10);
    44. }
    45. ImageOutputStream ios = ImageIO.createImageOutputStream(outImageFile);
    46. ImageIO.write(bi, "png", ios);
    47. }
    48. private static void createDocumentsWithResultsTest() throws Exception {
    49. ITesseract instance = getInstance();
    50. File imageFile = new File("img", "image.png");
    51. BufferedImage bi = ImageIO.read(Files.newInputStream(imageFile.toPath()));
    52. String outputbase = "target/test-classes/test-results/docrenderer1-5";
    53. List formats = new ArrayList<>(Arrays.asList(ITesseract.RenderedFormat.HOCR, ITesseract.RenderedFormat.PDF, ITesseract.RenderedFormat.TEXT));
    54. OCRResult or = instance.createDocumentsWithResults(bi, imageFile.getPath(), outputbase, formats, ITessAPI.TessPageIteratorLevel.RIL_WORD);
    55. System.out.println(or.getWords());
    56. }
    57. private static ITesseract getInstance() {
    58. ITesseract instance = new Tesseract();
    59. // 设置tessdata目录, 下载地址: https://github.com/tesseract-ocr/tessdata_best
    60. instance.setDatapath("D:\\programs\\TessractOCR\\tessdata");
    61. /**
    62. * 设置需要识别的语种,
    63. * chi_sim+eng: 表示识别简体中文和英文;
    64. * eng: 仅识别英文
    65. */
    66. instance.setLanguage("chi_sim+eng");
    67. instance.setOcrEngineMode(1); // 设置OCR引擎模式(OEM)
    68. instance.setPageSegMode(6); // 设置图片分割模式(PSM)
    69. return instance;
    70. }
    71. }

    2.4 READ.ME

    1. # Note
    2. Tesseract引入训练模型的方法
    3. 根据自己的需要下载需要的模型文件,将traineddata文件放在
    4. %TesseractOCR_HOME%\tessdata 目录(Tesseract安装目录)下就可以了。
    5. tessdata下载地址:
    6. https://github.com/tesseract-ocr/tessdata_best
    7. tessdata_best可用来再训练字库
    8. 训练方法参考文档:
    9. https://tesseract-ocr.github.io/tessdoc/tess4/TrainingTesseract-4.00.html
    10. # 参数释义
    11. ## 自定义配置
    12. config = r'-l chi_sim+eng --psm 6'
    13. # 其它OCR选项:
    14. # --tessdata-dir PATH:Specify the location of tessdata path.
    15. # --user-words PATH:Specify the location of user words file.
    16. # --user-patterns PATH:Specify the location of user patterns file.
    17. # --dpi VALUE:Specify DPI for input image.
    18. # -l LANG[+LANG]:Specify language(s) used for OCR.
    19. # -c VAR=VALUE:Set value for config variables. Multiple -c arguments are allowed.
    20. # --psm NUM:Specify page segmentation mode.
    21. # --oem NUM:Specify OCR Engine mode.
    22. text = pytesseract.image_to_string(Image.open(r'D:\workspace\tesseract-ocr\test.jpg'), config=config)
    23. ## ImageHelper
    24. getScaledInstance 放大图片
    25. getSubImage 截取图片
    26. convertImageToBinary 转二进制
    27. convertImageToGrayscale 将图像转换为灰度
    28. invertImageColor 反转图像颜色
    29. rotateImage 旋转影像
    30. ## 图片分割模式(PSM)
    31. tesseract有13种图片分割模式(page segmentation mode,psm):
    32. 0 – Orientation and script detection (OSD) only. 方向及语言检测(Orientation and script detection,OSD)
    33. 1 – Automatic page segmentation with OSD. 自动图片分割
    34. 2 – Automatic page segmentation, but no OSD, or OCR. 自动图片分割,没有OSD和OCR
    35. 3 – Fully automatic page segmentation, but no OSD. (Default) 完全的自动图片分割,没有OSD
    36. 4 – Assume a single column of text of variable sizes. 假设有一列不同大小的文本
    37. 5 – Assume a single uniform block of vertically aligned text. 假设有一个垂直对齐的文本块
    38. 6 – Assume a single uniform block of text. 假设有一个对齐的文本块
    39. 7 – Treat the image as a single text line. 图片为单行文本
    40. 8 – Treat the image as a single word. 图片为单词
    41. 9 – Treat the image as a single word in a circle. 图片为圆形的单词
    42. 10 – Treat the image as a single character. 图片为单个字符
    43. 11 – Sparse text. Find as much text as possible in no particular order. 稀疏文本。查找尽可能多的文本,没有特定的顺序。
    44. 12 – Sparse text with OSD. OSD稀疏文本
    45. 13 – Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific. 原始行。将图像视为单个文本行。
    46. ## OCR引擎模式(OEM)
    47. 有4种OCR引擎模式:
    48. 0 – Legacy engine only.
    49. 1 – Neural nets LSTM engine only.
    50. 2 – Legacy + LSTM engines.
    51. 3 – Default, based on what is available.
    52. ## 方向及语言检测OSD
    53. Tesseract支持方向及语言检测(Orientation and script detection,OSD) ,比如检测下面的图片:
    54. ![img.png](img/img.png)
    55. ### 检测方法:
    56. osd = pytesseract.image_to_osd('osd-example.png',config='--psm 0 -c min_characters_to_try=5')
    57. print(osd)
    58. ### 执行结果:
    59. Page number: 0
    60. Orientation in degrees: 90
    61. Rotate: 270
    62. Orientation confidence: 0.74
    63. Script: Han
    64. Script confidence: 0.83
  • 相关阅读:
    计算机毕业设计之java+javaweb的面向学生成绩分析系统
    PLC面向对象编程系列之双通气缸功能块(SMART梯形图)
    golang中使用泛型
    AMQP[RabbitMQ]小结
    通用分页(1)
    css:不同设备的适配和响应
    cordova 打包android app
    一、 计算机网络概论
    金仓数据库KingbaseES运维工具参考手册(6. 预防删除工具指南)
    linux命令
  • 原文地址:https://blog.csdn.net/justlpf/article/details/127900284