How-To:Linux 使用 Tesseract 做 OCR 圖文辨識

操作環境:

  • Fedora 34
  • Tesseract v4.1.3

 

在如今這個年代,利用 OCR(Optical Character Recognition)技術來辨識圖像上的文字,已經算是一項隨手可得的功能,並不必然得依賴特定的軟體就能夠實現。比方說其實線上的 Google 文件,就有提供 OCR 的能力。不過倘若希望以開放原始碼的工具來達成,則 Tesseract 這款 OCR 引擎應該是時至目前為止,維護最為積極也相對成熟的一項專案。

 

Tesseract 做圖文辨識有一定的成效,然而若是想要認真地對掃描文件進行辨識,那麼就 DR 自己的使用經驗來說,使用諸如 ABBYY FineReader 這類的商業軟體可能會是比較可靠的。

 

以下會簡單說明 Tesseract 的安裝及基本使用方式,它本身是命令行的操作方式。雖然也有其它的圖形化 OCR 軟體是以 Tesseract 作為後端引擎,不過這部份就不在本文的說明範疇內了。

 

1.1 安裝 Tesseract

Fedora 發行版上可以單純使用 dnf 指令進行安裝:

  • sudo dnf install tesseract

 

1.2 安裝 Tesseract 語言包

由於前一節的安裝指令也會將 Tesseract 的英文語言包一併安裝起來,所以在安裝完畢後,最至少就會有英文的辨識能力。然而倘若希望能夠辨識其它的語言,例如繁體中文,則首先可以執行以下 dnf 指令,搜尋有哪些語言包可供安裝:

  • sudo dnf search tesseract-langpack
  • sudo dnf search tesseract-script

 

從前述指令可以察覺到,Tesseract 的語言包其實存在兩種形式,分別是語言(language)和腳本(script)。其中前者即是單純對應某一語言;後者則是多個語言的集合,通常就是某一語言再加上英文,也就是雙語的組合。而根據前述指令所列出的清單,可以查看各個語言所對應的套件名稱。舉例來說就可以接著使用以下指令,來安裝繁體中文的語言包:

  • sudo dnf install tesseract-langpack-chi_tra tesseract-script-hant

 

1.3 檢查 Tesseract 所支援的語言

執行以下指令,確認當前 Tesseract 支援哪些語言選項:

  • tesseract --list-langs

 

倘若有依循前一節的語言包安裝步驟,則至少應會列出以下三個語言選項:

  • chi_tra(繁體中文)
  • eng(英文)
  • script/HanT(繁體中文 + 英文)

 

所列出之清單即是 Tesseract 能夠使用的語言,將會在下一節裡使用到。

 

2.1 Tesseract 基本操作

Tesseract 能夠讀取 PNG、JPG 及 TIFF 等常見的圖像格式。不過無法直接讀取 PDF,因此若有儲存為 PDF 的掃描文件,都必須先設法轉換為圖檔,再由 Tesseract 做讀取。以下範例指令會對 input.png 做英文辨識 ,然後將辨識出的文字送到標準輸出(stdout),也就是直接輸出在終端機上:

  • tesseract input.png stdout -l eng

 

事實上英文即為 Tesseract 的預設語言,所以可以不用透過參數明確指定。不過若是其它語言就有必要了,以此類推,倘若希望辨識繁體中文,便是將 eng 替換為 chi_tra:

  • tesseract input.png stdout -l chi_tra

 

若是希望能夠同時辨識中文及英文,那麼有兩種可行的作法。一種是將語言選項用加號合併起來(先後順序不影響);另一種則是用先前曾經提及過的腳本選項。也就是以下兩種方式擇一使用:

  • tesseract input.png stdout -l chi_tra+eng -c preserve_interword_spaces=1
  • tesseract input.png stdout -l script/HanT -c preserve_interword_spaces=1

 

額外加上的「-c preserve_interword_spaces=1」參數,是為了減少辨識後的中文出現多餘空格的情形。此外由於上述兩種作法背後是讀取不同的訓練資料,所以其實結果並不會很一致。

 

2.2 將辨識結果輸出成檔案

倘若將前一節指令裡的 stdout 替換為檔名(副檔名會自動加上),那麼就會是將辨識結果輸出成檔案了。舉例來說,以下指令能夠將 input.png 的辨識結果輸出成 output.txt:

  • tesseract input.png output -l eng txt

 

事實上 TXT 也是 Tesseract 檔案輸出的預設選項,所以加上 txt 參數並不是必要的。反之,若是希望輸出為 PDF,便是將 txt 替換為 pdf,如下所示:

  • tesseract input.png output -l eng pdf

 

上述指令的辨識結果便會輸出成一支 output.pdf,這支 PDF 會維持原圖檔的圖像,而辨識出來的文字會成為可供搜尋及複製的形式。此外需要留意的是,輸出格式的選項(txt、pdf 等等),在整組 Tesseract 指令中的所在位置是固定的。它必須一律放在最後面,也就是其它參數都得在它的前面,指令才能夠正確執行。

 

2.3 使用其它來源的語言包

在一般的使用情境裡,或許使用者都是利用發行版套件庫所提供的語言包,然後讓 Tesseract 讀取預設的資料路徑。但倘若有另外取得其它版本的語言包,其實也是有可便利切換的途徑。以 DR 自己偏好的作法,會先將系統上已安裝的 Tesseract 資料目錄複製一份複本:

  • rsync -rv /usr/share/tesseract/tessdata/ tessdata-new/

 

然後在這個新複製出來的 tessdata-new 目錄,將想要使用的語言訓練資料(*.traineddata)替換上去。後續在執行 Tesseract 時,便利用「--tessdata-dir」參數來指定資料目錄,就能夠以不同版本的訓練資料來進行辨識:

  • tesseract input.png stdout -l eng --tessdata-dir tessdata-new/

 

3.1 其它輔助工具

先前的說明曾提到過,Tesseract 無法直接讀取 PDF,都必須先轉換為圖檔。而這樣的需求是可以利用其它的工具來達成,例如 Ghostscript,相關操作說明可參考此 How-To 文件。

 

由 Ghostscript 所轉換出來的 PNG 或 TIFF,即能夠提供給 Tesseract 做辨識。而另一方面,倘若是手上有許多圖檔,但希望合併為單一 TIFF,那麼可以另外使用 ImageMagick 這支圖像工具,其安裝方式如下:

  • sudo dnf install ImageMagick

 

安裝完畢後,利用 ImageMagick 將當前目錄下所有的 PNG 合併為單一 TIFF(output.tif)的指令範例如下:

  • convert *.png output.tif

 

3.2 其它參考資料