不想打字?用 Python 把圖片變文字

用 Python 解決生活中的大小問題!

Frankie
CodingBar
6 min readMay 6, 2019

--

文/Frankie

你有遇過類似以下的情況嗎?

某次報告中,你負責整合所有人的資料,沒想到一位天兵組員拍了他的紙本資料就消失無蹤了。又或者是在某個廣告 DM 上看到了一篇好文,讓你很想把它變成文字分享給朋友。

如果你遇過類似問題,千萬不要錯過 pytesseract 這個好工具!它能夠用很簡單、基礎的方法將圖片轉換成文字(分辨圖片中的文字)。在我們開始介紹 pytesseract 這個 Python 模組之前,先來認識一下 Tesseract OCR 到底是什麼吧!

OCR 與 Tesseract

OCR 為光學文字識別的縮寫(Optical Character Recognition,OCR),白話一點就是將圖片翻譯為文字。而 Tesseract 是一個 OCR 模組,目前由 Google 贊助。Tesseract 已經有 30 年歷史,一開始它是惠普實驗室的一款專利軟體,於 2005 年開源,從 2006 年後由 Google 贊助進行後續的開發和維護, Tesseract 也是目前公認最優秀、最精準的開源 OCR 系統。

除了極高的精準度外,Tesseract 也有很高的靈活性,能夠通過訓練識別出任何字體(只要這些字體的風格不變就可以),也能識別出任何 Unicode 字符,是不是非常厲害呢?我們待會會用到的 pytesseract 模組就像是Tesseract的 python 包裝器。

準備工作

雖然 pytesseract 的基本使用方法很簡單,但還是需要一些先備知識,可以參考Bar主之前的文章。

1. 首先,電腦必須要安裝 Python,可以參考這篇:

2. 接著安裝所需的模組,我們會用到 pillow 和 pytesseract。

安裝方法,在終端機輸入(忘記什麼是終端機可以參考上面的文章):

pip install pillow

以及

pip install pytesseract

安裝完這兩個模組,之後想要使用就能直接在程式中匯入(import)了。

開始寫程式!

接著開啟你的 Python 編輯器,建立一個新的 .py 檔,準備開始寫點程式吧!可以參考這篇:

接著,神奇的事情發生了!竟然只需要以下幾行程式就能運行了:

from PIL import Image
import pytesseract

img = Image.open('test1.png')
text = pytesseract.image_to_string(img, lang='eng')
print(text)

首先,第一行及第二行是將我們剛剛安裝的模組匯入至這支程式中
PIL 包含在剛剛安裝的 pillow 模組,其中的 Image 模組能夠讀取圖片檔。
我們將想要轉成文字的圖片檔,放在和這支程式相同的目錄

第四行的 'test1.png' 是相對於這支程式(.py檔)的路徑,也就是該圖片的檔名,因此必須放在同一個資料夾程式才找得到檔案,而且檔名與副檔名都不可省略。

所有辨識文字、轉換的複雜過程全部都寫在 pytesseract 中了,我們只需要知道如何調用即可。接著看到第五行,image_to_string函式有一個關鍵字引數 lang,默認是英文,可以改變成你想要的語言字串。

常見的語言字串:英文 'eng'、簡體中文 'chi_sim'、繁體中文 'chi_tra'

我們舉兩個完整的例子看看:

將上面這張圖片命名為test1.jpg,並放在和程式同個目錄,程式如下:

from PIL import Image
import pytesseract

img = Image.open('test1.jpg')
text = pytesseract.image_to_string(img, lang='eng')
print(text)

執行結果如下:

再來一個例子,將底下的圖片命名為 'test2.jpg',放在和程式相同的目錄。

語言變成簡體中文,因此將 lang 參數從 'eng' 改成 'chi_sim',程式碼如下:

from PIL import Image
import pytesseract

img = Image.open('test2.jpg')
text = pytesseract.image_to_string(img, lang='chi_sim')
print(text)

執行結果如下:

有些字識別錯了,但正確率仍然很高,如果圖片是黑白的正確率會更高!

結語

是不是很方便呢?除了生活中的一些小問題能用 pytesseract 解決,在開發爬蟲程式時,經常會遇到需要驗證碼的情形,這時就能利用這個模組輕鬆解決。如果你還想到了什麼情景是能夠利用 pytesseract 解決的,趕快告訴 Bar主吧!

延伸閱讀

--

--