Tesseract-OCR

Tesseract

  • 介紹
  • 安裝
  • 語言支持
  • 運行命令
  • hello world
  • 字符識別準確率的影響因素
  • Tesseract的控制參數
  • Java中使用libtesseract引擎
  • 訓練本身的語言庫

介紹

Tesseract 是一套開源的光學字符識別引擎。它能夠將圖片中的文字轉換成能夠編輯的字符,並支持多種語言(uicode字符集)。所在github主頁:https://github.com/tesseract-ocr
Tesseract沒有內置的GUI工具,可是可使用其它一些第三方的工具:點擊查看第三方使用工具php

安裝

安裝包括兩個部分:一、Tesseract引擎(libtesseract)。二、語言庫。java

Windows下的安裝:
1.Tesseract 3.05-dev 和 Tesseract 4.00-dev兩個版本的安裝文件能夠在此下載: Tesseract at UB Mannheim
2.下載須要的語言庫,放在tessdata目錄下便可(語言庫下載見下文)。python

語言支持

一、Tesseract支持多種語言,可在此語言庫下載:https://github.com/tesseract-ocr/tessdata
二、可使用本身的訓練集來支持其它語言。參考文檔:https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseractgit

語言包下載:github

Tesseract 40
Tesseract 3.04 or 3.05windows

運行命令

命令:app

tesseract imagename/stdin outputbase/stdout [-l lang] [-psm pagesegmode] [configfile...]

運行命令選項maven

參數 解釋
imagename 要轉換的圖片,支持大部分的圖片格式
outputbase 生成的txt文件名,默認爲outbase
--tessdata-dir /path 指定語言庫路徑
--user-words /path/to/file 指定
--user-patterns /path/to/file specify The location of user patterns file
-c configvar=value Set value for control parameter. Multiple -c arguments are allowed.
-l lang 指定語言,(默認爲英文)
--psm N Set Tesseract to only run a subset of layout analysis and assume a certain form of image. The options for N are:(取值:0-9 )
--oem N 指定OCR 引擎所使用的模式(取值:0,1,2,3)
configfile 指定(hocr ,pdf)

單獨的命令選項編輯器

參數 解釋
-h 幫助信息
--help-psm 顯示分頁模式
--help-oem 顯示引擎模式
-v 版本信息
--list-langs 查看當前可使用的語言庫
--print-parameters 打印tesseract的控制參數

命令使用舉例工具

指定語言識別:
tesseract myscan.png out -l chi_sim (解釋:使用中文簡體識別圖片myscan.png,將識別的字符輸出到out.txt文件中)
多語言共同識別:
tesseract myscan.png out -l eng+chi_sim (解釋:使用英文、中文簡體進行字符識別......)

hello world

以識別中文字符爲例:

1.安裝程序
2.添加中文語言庫
3.找一張中文圖片,以下

4.執行識別命令:tesseract 6.jpg 6 -l chi_sim。 生成6.txt文件,內容以下

5.結果:完美,在圖片清晰的狀況下,基本能夠比較完美識別中文字符。
6.(同一個圖片下降清晰度,識別精準度將大打折扣)。

字符識別準確率的影響因素

在線文檔:https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality

1、圖像字符識別的影響因素

1.調整圖像比例

圖像DPI至少爲300時,識別效果會更好。

2.圖像二值化

tesseract內部會自動將圖像二值化。可是,若是圖片明暗不均勻,則最終的識別效果不會很好。

3.消除噪點

噪點主要是指將光線做爲接收信號並輸出的過程當中所產生的圖像中的粗糙部分,也指圖像中不應出現的外來像素,一般由電子干擾產生。若是可以在拍攝期間就把噪點控制到最低,那麼降噪工具就可能會退居二線了。
進行二值化處理的時候,一些噪點是沒法消除的,因此噪點的大量存在會增長文字識別難度。

4.旋轉和去偏移

Tesseract是進行直線掃描的。若是圖像中的文字歪歪斜斜,會嚴重影響字符的識別精準度。以下:

5.祛除邊界

不少時候,經過掃描獲得的圖片,周圍會有黑色的邊框(以下圖)。Tesseract極可能會將邊框轉換爲字符,當邊框顏色漸進變化時,這種現象會更加嚴重。

_______
**********

2、Tools / Libraries (提升識別精準度可使用的工具和庫)

[Leptonica](http://leptonica.com/)    (tesseract的內置庫)
[OpenCV](https://opencv.org/)
[Scan Tailor](http://scantailor.sourceforge.net/)
[ImageMagick](http://www.imagemagick.org/script/index.php)
[unpaper](https://www.flameeyes.eu/projects/unpaper)
[ImageJ](https://imagej.nih.gov/ij/)
[Gimp](https://www.gimp.org)


3、使用合適的頁面切割模式

使用 -psm 參數:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR.
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.


4、字典、單詞列表和模式

Tesseract內部僅僅默認,對句子中單詞的識別進行優化。當須要識別收據、價格列表、代碼等其它類型字符的時候,要使用一些設置並結合適合的頁面分隔方法來提升識別的精確度。
1.若是識別的大部份內容不屬於字典,禁用Tesseract使用的字典。將配置變量:load_system_dawg和load_freq_dawg設置爲false來禁用它們。
2.在Tesseract的單詞列表中添加詞語來幫助識別,或者添加經常使用的字符模式。
3.若是之別的內容只有數字,能夠指定僅識別數字:tesseract a.jpg out digits

Tesseract的控制參數

查看控制參數默認值及簡單功能描述命令

tesseract --print-parameters

參數分爲三種類型:

init only tesseract的初始化參數
general parameters 控制tesseract各方面的執行功能。
debug parameters 調試
_______
**********

Java中使用libtesseract引擎

tess4j

Tesseract 在多種語言上實現了封裝接口。可使用C、C++、C#、python、java等多種語言來使用libtesseract引擎來進行圖像字符的識別。
其中,JAVA使用JNA包裝器tess4j來實現對Tesseract OCR API的使用。能夠在maven 中心倉庫中找到tess4j。
tess4j主頁地址http://tess4j.sourceforge.net/

tess4j支持

一、TIFF, JPEG, GIF, PNG, and BMP 格式的圖片
二、多頁 TIFF 圖片
三、PDF 文檔格式

tess4j包提供的圖像識別及處理功能

1)用於圖像處理的功能
生成tif、合併tif、獲取像素數據、進行圖像縮放、圖像旋轉、改變圖像顏色、灰度化圖像等
2)用於圖像字符識別的功能
執行圖像識別、設置tesseract初始化參數、設置語言庫路徑、指定識別語言、引擎模式、頁面切割方法等

使用tess4j進行圖像字符識別

一、新建項目tesseract,使用maven引入tess4j。
二、將所需語言包tessdata文件夾放到根目錄。
三、將要識別的圖片放到根目錄。以下圖:
注:tess4j.jar and lept4j.jar包中內嵌了Tesseract, Ghostscript 和 Leptonica Windows 32- and 64-bit DLLs。所以,windows平臺上不須要單獨安裝tesseract,在其它平臺使用則要首先安裝tesseract程序。

四、使用官網CodeDemo進行字符識別測試

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
public class TessTest {
    public static void main(String [] args){
        File imageFile=new File("2.png");
        ITesseract instance=new Tesseract();//JNA Interface Mapping
        try {
            String result=instance.doOCR(imageFile);
            System.out.println(result);
        }catch (TesseractException e){
            System.err.println(e.getMessage());
        }
    }
}

識別結果以下:



訓練本身的語言庫

1、Tesseract的語言庫訓練機制

1)Tesseract最初只是設計用來識別英文的。如今,tesseract內置的訓練系統已經能夠支持其它語言。
2)Tesseract提供了約一百種語言庫供咱們使用。可是,若是有須要,咱們可使用tesseract的訓練機制來建立本身的語言庫。
3)Tesseract 3.0開始,支持任何用UTF-8編碼的Unicode字符。
4)在處理擁有大量字符集的語言時速度很慢(好比中文),可是依然能夠良好的進行識別。
5)Tesseract須要將不一樣的字體分開,來識別相同字符的不一樣形狀。訓練的字體種類限制在64種。運行時的狀態嚴重依賴於所提供字體的數量,通常、使用32個以上字體進行訓練就會導入運行速度的顯著下降。

2、數據文件的準備

1)要訓練本身的語言庫,須要構建一系列的基礎數據文件,而後使用combine_tessdata命令將基礎數據文件合併爲語言庫lang.traineddata便可。
2)例如:英文語言庫--》eng.traineddata的基礎數據文件以下,有些數據文件是必須的、有一些是可選的(雖然是可選的,可是在必要的時候能夠提升語言庫的準確性)
eng.config
eng.unicharset(必須)
eng.unicharambigs
eng.inttemp(必須)
eng.pffmtable(必須)
eng.normproto(必須)
eng.punc-dawg
eng.word-dawg
eng.number-dawg
eng.freq-dawg

3、訓練程序

一、建立訓練要使用的圖片和box file

1)圖片爲訓練須要的png、jpg、tif等文件。
2)box file 是 包含圖片裏字符座標信息(該座標爲字符周圍邊框的座標)的文本文件,每個行一個字符(一個box file和一個圖片相對應,稱爲tif/box文件對)。
使用命令:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
3)最難最關鍵的一步:打開box文件,將識別錯的字符改正,將一個字符識別爲多個的改正。
識別錯誤少的狀況下能夠手動修改,可是當錯誤量多而複雜的時候,手工幾乎是不可能完成的(下文會給予實例說明)。
須要使用tesseractbox編輯器來完成字符糾錯工做。官網推薦基於各類語言的工具:https://github.com/tesseract-ocr/tesseract/wiki/AddOns

2.使用Tesseract的訓練模式執行語言庫訓練

使用訓練模式來執行image/box 文件對,使用命令:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train
生成[lang].[fontname].exp[num].tr 文件,該文件包含了語言庫中全部字符的特徵。

3.生成unicharset文件

該unicode字符集文件包含了通過tesseract引擎訓練的每個unicodez字符的信息。
使用命令:
unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box ...

4.對提取的字符特徵進行聚類處理,生成字符的形態特徵

使用命令:
1)shapeclustering
shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...' 生成文件: shapetable(對字符聚類生成的主形狀表) 2)mftrainingmftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...生成文件: inttemp(形狀原型) pffmtable(每一個字符的預期特徵數) 3)cntrainingcntraining lang.fontname.exp0.tr lang.fontname.exp1.tr ...`
生成文件:
normproto(字符歸一化靈敏度原型)

5.合併數據文件

執行命令:
combin_tessdata lang.
命令完成便可生成語言包 art.traineddata

4、訓練實例:

1.建立訓練要使用的圖片和box file

1)訓練字符集:「中、華、人、民、共、和、國」。建立圖片,命名爲 lang.art.num0.tif :

2)建立對應的box file(使用-l chi_sim指定用中文簡體來識別)
tesseract lang.art.num0.tif lang.art.num0 -l chi_sim batch.nochop makebox
生成lang.art.num0.box文件:

3)打開box文件,進行糾錯處理(本文使用jtesseditor),主要分爲如下三步:
第1、將下圖中錯誤的文字改正。
第2、將1個字符識別爲多個字符的行合併(例如:合併三、4兩行,包括字符和座標的合併)。
第3、將多個字符識別成一個字符的進行字符分割(此例中沒有出現,這種狀況將比合並更加複雜)
對於須要合併或者拆分的狀況,若是不借助工具,而直接手工編輯box文件來糾錯,幾乎是不可能完成的事情。

糾錯後的box文件以下:

2.訓練語言庫

執行命令:
tesseract lang.art.num0.tif lang.art.num0 box.train
生成 lang.art.num0.tr 文件:

3.生成unicharset文件
unicharset_extractor lang.art.num0.box

4.對提取的字符特徵進行聚類處理,生成字符的形態特徵

1)執行命令:
shapeclustering -F font_properties -U unicharset lang.art.num0.tr' 2)執行命令:mftraining -F font_properties -U unicharset -O unicharset lang.art.num0.tr3)執行命令:cntraining lang.art.num0.tr`

5.合併數據文件

1)將art.做爲上面生成數據文件(shapetable, normproto, inttemp, pffmtable, unicharset)的前綴
2)執行命令:
combine_tessdata art.
生成語言包:

6.使用本身的語言包進行字符識別

1)將art.traineddata語言包放到電腦上安裝的tesseract的語言庫中
2)識別圖像:
tesseract 1.jpg 1 -l art
識別成功:

相關文章
相關標籤/搜索