如何用Tesseract做日文OCR(c#实现)
首先做一下背景介紹,Tesseract是一個開源的OCR組件,主要針對的是打印體的文字識別,對手寫的文字識別能力較差,支持多國語言(中文、英文、日文、韓文等)。是開源世界里最強的一款OCR組件。當然和世界最強的OCR工具Abbyy相比還是有一點差距,尤其在圖片質量較差時,差距還是明顯的。
網上有很多關于如何使用這個組件的介紹,不過都是針對英文識別的。而如果是對中文或日文等方塊字進行識別,除了需要使用不同的語言包外,還要對Tesseract做一些特別的設置,否則識別率會很低,以下我就和大家分享一下我使用Tesseract對日文做OCR的一些經驗。
第一步,是要下載Tesseract組件,最簡單的方法就是使用VisualStudio的NUGet來下載。選擇第一個組件。
第二步,下載日文語言包,由于在大陸地區無法訪問google,所以不能打開官網直接下載語言包。我給出文件的地址,可以使用迅雷下載。
http://tesseract-ocr.googlecode.com/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供開發者下載。
總結
以上是生活随笔為你收集整理的如何用Tesseract做日文OCR(c#实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百合cp驾驶姿势(百合cp姿势参考图)
- 下一篇: 墨西哥人说什么语(墨西哥人为什么说西班牙