Tess4j文字识别库的相关研究

Tess4j是Tesseract文字识别引擎的基于Java的Wrapper.

用Gradle引入

调用Tess4j的Gradle:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

简单使用

Tess4J的使用比较简单,创建Tesseract对象之后调用DoOCR即可。
注意需要设置一下训练数据的路径。如果你配置了环境变量TESSDATA_PREFIX=C:\Program Files (x86)\Tesseract-OCR\tessdata 的话,可以不需要在代码里面指定。

       Tesseract instance = new Tesseract();
        instance.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");
        instance.setPageSegMode(PageSegMode);
        instance.setLanguage(language);
        String result = instance.DoOCR("test.jpg");

但是这种默认的识别,效果并不是特别好。为了提升识别效果,可以做一些优化

  • 反转为白底黑字,提升效果显著
  • 只识别特别的区域,提升效果显著
  • 设置特定的分页模式,识别效果显著
  • 灰度化,提升效果中等

提升识别效果

参照:
如何提升识别效果

  • 识别可以指定相应的DoOCR函数来识别指定的区域。
  • 使用PageSegmentMode (PSM,分页模式)来指定图像的分布,比如是单行,多行,分散式的。以便更好地提升识别效果。
    PSM的定义:https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality#page-segmentation-method
  • 对于4.0版本来说,建议反转图像成白底黑字
  • 建议缩放以便获得合适的dpi
  • 在Tesserdata 目录下还可以放置用户自定义的词和自定义的样式。请修改 eng.user-words 和 eng.user-patterns。

Config

参考 https://github.com/tesseract-ocr/tesseract/blob/0b72f4b7225583c271a34f2dfd16c1b169cf4c57/doc/tesseract.1.asc#config-files-and-augmenting-with-user-data
关于Config的说明。
Config的定义在
https://github.com/tesseract-ocr/tesseract/blob/5d5ae6a96392d77b9a430a4981e97a040487ac25/src/ccmain/tesseractclass.h

SetConfig()

SetConfig指定配置文件名,然后配置文件名中有若干设置:

load_system_dawg     F
load_freq_dawg       F
user_words_suffix    user-words
user_patterns_suffix user-patterns

例如这个配置文件名叫 bazzar,内容指定不加载系统自己的词典和常用词典,使用用户自定义的pattern和words,后缀使用 user-words.

setTessVariable()

TBD

GetWords()

用GetWords可以得到强类型化的解析结果而不仅仅是纯文本。会返回解析获取的词,以及每个词的坐标位置还有置信区间。

训练数据的获取

训练数据是包含在tess4j的Jar包中的。如果是Gradle下载的话,位置一般在C:\Users\abc.gradle\caches\modules-2\files-2.1\net.sourceforge.tess4j\tess4j\4.4.0\50fbd7b30d1177b1fa50ad3703e47bfc0ebb42e7 之类的目录下。

可以用LoadLibs函数来从Jar包中抽取tessdata数据,而不一定使用预装的Tesseract的数据。

package tess4j.example;

import java.io.File;
import net.sourceforge.tess4j.*;

public class TesseractExample {
    public static void main(String[] args) {
        // System.setProperty("jna.library.path", "32".equals(System.getProperty("sun.arch.data.model")) ? "lib/win32-x86" : "lib/win32-x86-64");

        File imageFile = new File("eurotext.tif");
        ITesseract instance = new Tesseract();  // JNA Interface Mapping
        // ITesseract instance = new Tesseract1(); // JNA Direct Mapping
        // File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Maven build bundles English data
        // instance.setDatapath(tessDataFolder.getPath());

        try {
            String result = instance.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }
    }
}

输出格式

除了输出纯粹文字之外,后期可以关注一下HOCR格式的输出,除了输出识别内容还会标记字符的位置。

多种语言

tesseract的多语言的训练数据:https://github.com/tesseract-ocr/tessdata

一种将文字与背景分离的方法

http://www.m.cs.osakafu-u.ac.jp/cbdar2007/proceedings/papers/O1-1.pdf
基于这个文章的一个python的实现。
https://github.com/jasonlfunk/ocr-text-extraction/blob/master/extract_text

image.png

image.png

Leptonica 提供的二分和灰度化的函数

http://tpgit.github.io/UnOfficialLeptDocs/leptonica/binarization.html

一种OpenCV的图像二值化处理方法

https://stackoverflow.com/questions/39233823/opencv-for-ocr-how-to-compute-thresholding-levels-for-gray-image-ocr


参考:
https://linuxhint.com/tess4j_maven_java_tutorial/

你可能感兴趣的:(Tess4j文字识别库的相关研究)