Tess4j文字识别库的相关研究

Tess4jTesseract文字识别引擎的基于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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容