https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality
如果你使用Tesseract不能獲得理想的輸出結果,可能會有很多原因。但是請記住,除非你使用一個非常罕見的字體,或者使用一種沒有被訓練過的新語言這些情況,重新訓練Tesseract不會有多大效果。
圖片處理
Tesseract在做真正的OCR之前,內部(使用Leptonica庫)先進行了各種圖片處理。一般來說,它這些准備工作做的不錯,但是不可避免的還是會有不足夠的地方,如果圖片處理不到位的話識別准確率也不會很高。
你可以在運行Tesseract的時候,設置配置變量tessedit_write_images=true
,在輸出的日志中可以看到Tesseract是如何處理圖片的。如果返回的tessinput.tif
文件看起來有問題,那么在OCR之前不妨進行一些手動的圖片處理。
修改比例(Rescaling)
如果圖片的DPI有300以上,Tesseract可以處理的很棒,所以如果DPI不夠,不妨調整比例。
二值化(Binarisation)

也就是說,最好把圖片變為黑白圖片。Tesseract會在內部做這個事情(使用Otsu算法),但是處理結果可能不是最好的,特別是在背景顏色不算均勻暗色的時候。
如果你不能提供更好的圖片,你也可以使用不同的算法。比如ImageAutoThreshold(Java), OpenCV Image Thresholding(Python), scikit-image Thresholding(Python)的文檔。
去除噪點(Noise Removal)

噪點,是圖片中那些隨機的暗色或者彩色點,這讓圖片中的文字更加難以閱讀。Tesseract的二值化處理步驟沒有辦法處理一些類型的噪點,這時候會讓解析精度驟降。
旋轉/偏移校正(Rotation / Deskewing)

歪曲的圖片,會導致頁面被掃描的時候不是筆直的。如果頁面太歪曲,Tesseract的行數分割不會很准確,這也會影響OCR的最終質量。
邊界(Borders)
掃描中的邊界移除

被掃描的頁面,可能會有一些暗邊褶皺。這可能會導致提取一些額外的錯誤的字符。
缺少邊界
如果你想要OCR的文本區域沒有邊界,Tesseract可能會碰到問題。請看這個帖子,你也可以使用ImageMagick來增加一條邊界。
convert 427-1.jpg -bordercolor White -border 10x10 427-1b.jpg
透明度/Alpha通道
一些圖片格式(比如png),可能使用Alpha通道來提供透明度特性。
Tesseract3.x希望用戶在輸入給tesseract之前移除圖片的alpha通道。可以使用下面的命令:
convert input.png -alpha off output.png
Tesseract4.00開始,內部使用了leptonica的函數pixRemoveAlpha()
來移除alpha通道:通過為alpha部分混入白色背景色來解決。在一些少見的情況下,這個方法可能會導致問題,用戶需要手動移除alpha通道。
工具/庫
例子
如果你想要知道如何使用程序來提升圖片質量,可以看看下面的例子:
- OpenCV -- 旋轉 -- C++例子
- Fred的ImageMagick TEXTCLEANER -- 一個bash腳本,處理文本文檔,清除文本的背景色。
- rotation_spacing.py -- 一個Python腳本,自動檢測圖片中的旋轉以及行之間的空間。
- crop_morphology.py -- 一個Python腳本,找到圖片中文本區域,使用了OpenCV和numpy。
- noteshrink -- Python例子,清理待掃描的圖片。還有一篇詳細介紹代碼的blog: 壓縮以及加強手寫筆記
- uproject text -- 一個Python例子,恢復了圖片的透視。詳細的blog: Unprojecting text with ellipses
- page_dewrap -- 一個Python例子,使用‘cubic sheet‘模型為圖片進行dewrapping。詳細blog: Page dewrapping
頁面划分的方法
默認情況下,Tesseract會認為圖片是划分好的,會識別整個圖片。如果你只要對一個小塊區域進行OCR,請使用--psm
參數。注意,為文本加入白色的border也有用,請看issue 398.
想要知道Tesseract支持的所有頁面分割模式,請使用命令tesseract -h
:
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.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line,
bypassing hacks that are Tesseract-specific.
字典,單詞列表以及模式
默認情況下,Tesseract被優化為識別單詞組成的句子。如果你想要識別一些其它的模式,比如收據,價格列表,或者代碼。可以使用一些方法來提高識別率,比如選用合適的文本分割方法。
如果你要識別的文本都不是字典中的單詞,禁用Tesseract的字典功能可以提升識別准確率。可以通過同時設定配置load_freq_dawg=false
& load_system_dawg=false
來禁用字典。
另外,也可以為Tesseract的單詞列表加入一些新的詞,來幫助提升識別准確率。或者可以加入通用的字符模式,如果你對你的輸入模式有了解,這種方式可以大幅提升准確率。更多詳情請參考Tesseract手冊.
如果你知道,只會碰到語言中的一部分子集,比如只有數字,你可以使用配置tessedit_char_whitelist
.