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
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/