在Windows 上使用Python進行光學字元辨識(OCR)

Overcomer
6 min readSep 30, 2020

--

最近在網頁上看到部分的光學字元辨識(Optical Character Recognition, OCR)實作就覺得好方便,可以直接將影像中的文字辨識出來,且在生活中就可以接觸到,像是LINE的影像就可以直接圖像轉為文字,因此決定來接觸看看。廢話不多說就直接開始吧!

總共有6個步驟:

  1. 安裝tesseract軟體
  2. 設定tesseract的路徑至環境變數
  3. 使用pip安裝pillow pytesseract套件
  4. 新增自己要辨識的語言檔案
  5. 將下載的檔案放置tesseract軟體的tessdata目錄裡
  6. Python程式範例

1.下載並安裝tesseract

先到https://digi.bib.uni-mannheim.de/tesseract/下載
windows的5.0.0-alpha版本並安裝。

2. 設定tesseract的路徑至環境變數

將tesseract軟體安裝的路徑新增至xxx的使用者變數Path變數裡。

環境變數的設定

3. 使用pip安裝pillow opencv pytesseract套件

※注意:須要事先安裝Python軟體才會有pip套件管理程式。

pip install pillow opencv-python pytesseract

4. 新增自己要辨識的語言檔案

https://github.com/tesseract-ocr/tessdata_fast下載所需要的語言檔案。在範例中使用到的是中文繁體中文簡體英文,而英文在一開始軟體的安裝就附加了。因此只需要下載chi_tra.traineddatachi_sim.traineddata兩個檔案即可。

Ťesseract支援的語言列表
Ťesseract支援的語言

影像來源:(https://github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc#languages)

5. 將下載的檔案放置tesseract軟體裡的tessdata目錄

將下載下來的兩個檔案放置在tesseract軟體裡的tessdata目錄裡。

tessdata目錄

6. Python程式範例

以下的範例圖片都是來自網路圖片

範例一-中文歌譜

張韶涵-隱形的翅膀
張韶涵-隱形的翅膀

影像來源:https://www.poppiano.org/sheetjpg/08938.png

程式碼

from PIL import Image

import pytesseract as pytess

img = Image.open(“F:/Github/AI_Tools/Computer Vision/Optical Character Recognition/images/song sheet/隱形的翅膀.png”)

print(pytess.image_to_string(img, lang =‘chi_tra’))

輸出結果

範例一辨識結果

程式碼

import cv2

import pytesseract as pytess

img = cv2.imread( “F:/Github/AI_Tools/Computer Vision/Optical Character Recognition/images/article/article-2.jpg”)

print(pytess.image_to_string(img, lang =‘eng’))

輸出結果

範例二辨識結果

範例三-數學方程式

數學公式
數學公式

影像來源:https://qph.fs.quoracdn.net/main-qimg-e8d72ad4ecae08b92019e5ea4de4a639

程式碼

import cv2

import pytesseract as pytess

img = cv2.imread(“ F:/Github/AI_Tools/Computer Vision/Optical Character Recognition/images/math/formula-1.jpg”)

print(pytess.image_to_string(img, lang =‘eng’))

輸出結果

結語

範例一因著夾雜許多中文繁體之外的內容,如樂理的符號和簡譜等,所以輸出的結果不如理想。

範例二的辨識度最高。因著字體統一,內容以較整齊的方式排列,輸出結果可以說是非常滿意,幾乎90%以上的準確率。

範例三本來是用數學的檢測器做辨識,但發現輸出結果太糟了,因此改用英文的方式做辨識,發現輸出結果比用數學的檢測器來的合理許多。

以上只是簡單的範例,若是要增加OCR辨識的準確率,可能需要對影像作預處理來提升辨識的準確度。

--

--