使用Tesseract進行圖片文字識別

mingupupup發表於2024-12-06

Tesseract介紹

Tesseract 是一個開源的光學字元識別(OCR)引擎,最初由 HP 在 1985 年至 1995 年間開發,後來被 Google 收購併開源。Tesseract 支援多種語言的文字識別,能夠識別圖片中的文字,並將其轉換為可編輯和可搜尋的資料格式。它適用於多種應用場景,包括文件掃描、影像處理、數字存檔等。

Tesseract 的最新版本顯著提高了識別準確率,支援的檔案格式包括 TIFF、JPEG、PNG 等常見圖片格式。此外,Tesseract 還提供了一個命令列工具,允許使用者透過簡單的命令列輸入來執行 OCR 任務。對於開發者而言,Tesseract 提供了多種程式語言的 API 介面,如 C++、Python、Java 等,使得整合 OCR 功能到各種應用程式中變得更為容易。

除了基本的 OCR 功能外,Tesseract 還支援語言模型和訓練工具,允許使用者根據特定需求訓練自定義模型,以提高某些特定型別或格式文字的識別準確率。這些特性使得 Tesseract 成為了一個強大而靈活的 OCR 工具,廣泛應用於個人和企業的文字數字化處理中。

GitHub地址:https://github.com/tesseract-ocr/tesseract

官方文件地址:https://tesseract-ocr.github.io

image-20241206093004264

下載安裝Tesseract

下載Tesseract

Home · UB-Mannheim/tesseract Wiki

image-20241205154902702

安裝的時候,記得選上中文語言包:

image-20241205155311078

輸入

tesseract -v

檢視Tesseract是否安裝成功

image-20241205155544017

設定環境變數:

image-20241205155637253

image-20241205155659991

image-20241205155730786

輸入Tesseract的安裝地址:

image-20241205155954574

注意安裝路徑最好不要包含中文,由於C盤空間還比較充足,我就裝在預設位置了。

再次驗證安裝是否完成:

tesseract -v

image-20241205160217678

安裝成功完成。

Tesseract的基本命令列使用

基本文字識別

最簡單的命令是將圖片中的文字識別並輸出到標準輸出(螢幕):

tesseract D:\test2.png stdout

預設識別的是英文的,先拿一個英文的圖片試試:

圖片文字識別的效果

image-20241206090525850

效果還是很ok的。

再試試一箇中文的圖片:

image-20241206090807707

預設是無法識別中文的,這時候需要指定語言才行。

指定一種語言識別

如果圖片中的文字不是英文,你需要指定相應的語言。Tesseract 支援多種語言,可以透過以下命令檢視支援的語言:

tesseract --list-langs

image-20241206091040601

會出現你已經下載了語言包的語言。

指定語言的命令如下(例如,識別中文):

tesseract D:\test.png stdout -l chi_sim

這裡的 -l chi_sim 表示使用簡體中文語言模型。

image-20241206091338414

效果也很不錯。

指定多種語言識別

有時候我們需要同時識別多種語言,以下面這張圖片為例:

在命令列中新增-l LANG[+LANG]可以使用多種語言進行識別:

tesseract D:\test3.png stdout  -l eng+chi_sim

image-20241206094034416

效果也還行。但是會發現識別的中文很多地方都有空格。

將中文改為主要識別語言:

tesseract D:\test3.png stdout  -l chi_sim+eng

image-20241206094257778

可以發現識別的空格少了很多。

儲存識別文字到檔案

也可以把識別的內容儲存在一個txt檔案中,命令如下所示:

tesseract D:\test2.png D:\output.txt 

image-20241206092534999

使用quiet模式抑制訊息

不使用quiet模式與使用quiet模式的對比:

image-20241206094844541

少了表示 Tesseract 正在嘗試估算輸入影像的解析度的資訊Estimating resolution as 182

可搜尋的pdf輸出

這將建立一個包含影像和單獨可搜尋文字層的PDF,其中包含識別出的文字:

tesseract D:\test2.png D:\output -l eng pdf

實現效果:

image-20241206095505631

HOCR輸出

在命令末尾新增hocr以使用‘hocr’配置檔案,獲取HOCR輸出:

tesseract D:\test2.png - -l eng hocr

識別效果:

image-20241206095846301

這樣不夠直觀,儲存在一個html檔案中,然後再開啟看看:

tesseract D:\test2.png D:\test2.html -l eng hocr

把生成的檔案字尾改為.html,用瀏覽器開啟,效果如下所示:

image-20241206100421063

TSV輸出

在命令末尾新增“tsv”配置檔案以獲取TSV輸出:

tesseract D:\test5.jpg - -l chi_sim tsv

以這張圖片為例:

實現效果如下所示:

image-20241206101407184

使用不同的頁面分割模式

-psm 3 - 全自動頁面分割,但無方向和指令碼檢測。(預設)

以這張圖片為例:

tesseract D:\test4.png - --psm 3

實現的效果:

image-20241206102552259

-psm 6 - 假定文字為一個整體均勻的塊。

以這張圖片為例:

tesseract D:\test5.png - --psm 6

實現效果如下所示:

image-20241206103029396

使用 -c preserve_interword_spaces=1 來保留空格

tesseract D:\test5.png - --psm 6 -c preserve_interword_spaces=1

實現效果如下所示:

image-20241206103136672

使用pdftotext保持文字輸出的佈局

tesseract D:\test5.png D:\test5 -l eng –psm 11 pdf

實現的效果:

image-20241206104231827

總結

現在圖片文字識別已經有多種方式可以實現,也可以透過雲服務商的文字識別服務,缺點就是需要網路,數量多了需要收費,優點就是識別準確率比較高。使用Tesseract與PaddleOCR這種方式的好處就是離線可用,速度也挺快的。還有一種目前還沒試過的方式,就是使用多模態的大語言模型,缺點可能就是如果使用大模型服務提供商會比較耗費token,自己本地用ollama又比較吃配置相對於Tesseract與PaddleOCR而言,還有就是多模態大語言模型可能自己會出現一些別的內容。

之前寫過幾篇關於PaddleOCR的文章,感興趣也可以閱讀:

1、如何自己動手實現一個圖片解答小助手

2、C#使用PaddleOCR進行圖片文字識別

相關文章