當前位置:編程學習大全網 - 腳本源碼 - 如何用Tesseract做日文OCR

如何用Tesseract做日文OCR

首先做壹下背景介紹,Tesseract是壹個開源的OCR組件,主要針對的是打印體的文字識別,對手寫的文字識別能力較差,支持多國語言(中文、英文、日文、韓文等)。是開源世界裏最強的壹款OCR組件。當然和世界最強的OCR工具Abbyy相比還是有壹點差距,尤其在圖片質量較差時,差距還是明顯的。

網上有很多關於如何使用這個組件的介紹,不過都是針對英文識別的。而如果是對中文或日文等方塊字進行識別,除了需要使用不同的語言包外,還要對Tesseract做壹些特別的設置,否則識別率會很低,以下我就和大家分享壹下我使用Tesseract對日文做OCR的壹些經驗。

第壹步,是要下載Tesseract組件,最簡單的方法就是使用VisualStudio的NUGet來下載。選擇第壹個組件。  

第二步,下載日文語言包,由於在大陸地區無法訪問google,所以不能打開官網直接下載語言包。我給出文件的地址,可以使用迅雷下載。

/files/tesseract-ocr-3.02.jpn.tar.gz

下載完成後將語言包文件解壓後放到tessdata文件夾下。

到目前為止,準備工作已經就緒,可以開始編寫代碼。

第三步,初始化Tesseract組件,代碼如下。

TesseractEngine engine = new TesseractEngine(@"tessdata文件夾路徑", "jpn", EngineMode.Default))

第四步,設置OCR參數,關於各參數的解釋,可以參照官網

Useful parameters for Japanese and Chinese

Some Japanese tesseract user found these parameters helpful for increasing tesseract-ocr (3.02) accuracy for Japanese :

Name Suggested value Description

chop_enable T Chop enable.

use_new_state_cost F Use new state cost heuristics for segmentation state evaluation

segment_segcost_rating F Incorporate segmentation cost in word rating?

enable_new_segsearch 0 Enable new segmentation search path. It could solve the problem of dividing one character to two characters

language_model_ngram_on 0 Turn on/off the use of character ngram model.

textord_force_make_prop_words F Force proportional word segmentation on all rows.

edges_max_children_per_outline 40 Max number of children inside a character outline. Increase this value if some of KANJI characters are not recognized (rejected).

以下是代碼   

engine.SetVariable("chop_enable ", "F");

engine.SetVariable("enable_new_segsearch", 0);

engine.SetVariable("use_new_state_cost ", "F");

engine.SetVariable("segment_segcost_rating", "F");

engine.SetVariable("language_model_ngram_on", 0);

engine.SetVariable("textord_force_make_prop_words", "F");

engine.SetVariable("edges_max_children_per_outline", 50);

這裏面chop_enable參數與官網推薦的不太壹樣,我發現按照官網的設置,會有很多文字識別不出來。

第五步,開始識別。

var page = engine.Process(p);

var testText = page.GetText();

var c=page.GetMeanConfidence();

第壹行代碼返回壹個Page對象,通過該對象可以獲得識別的文本,而且還可以獲得識別文本所在位置(這個在識別非固定模式文檔時非常有用,可以根據關鍵字動態查找識別字段位置)。

在例子中OCR做全文識別,但是做全文識別很多情況下識別質量壹般,最好增加識別區域參數,同時將PageSegMode參數設置為PageSegMode.SingleBlock(代表多行大小相同的文字)或PageSegMode.SingleRow(代表單行大小相同的文字)。

第二行和第三行分別返回識別的文本與識別的信任度。在實際使用時我發現識別信任度不是特別有用。無論識別對錯,信任度基本在0.7左右,有些時候信任度較高,識別結果反而是錯誤的。

經過以上幾步,就可以完成日文的OCR。但要讓以上代碼成功運行,還必須要在安裝VC++運行時2012,否則會報錯。

我使用以上方法對掃描圖片進行測試,發現識別精確度還是比較高的,尤其在指定區域與PageSegMode參數後。但是日文字庫也存在壹些低級失誤,如將數字“1”識別成了漢字“壹”等。如果要想解決這個問題,必須要從頭訓練日文,這個工作量非常大!而這真的是Tesseract壹個非常不智能的地方,應該支持在原有訓練字庫的基礎上追加訓練內容!或者在官網上提供Box文件和訓練用Tif供開發者下載。

  • 上一篇:《第壹誡》到底講什麽啊!後半集看不懂啊!
  • 下一篇:用柳樹可以比喻什麽?
  • copyright 2024編程學習大全網