在Python中使用Tesseract進(jìn)行OCR識別

本教程翻譯自PyImageSearch英文原文

Tesseract OCR

上周的博客內(nèi)容想暗,我們學(xué)習(xí)了如何安裝Tesseract去做OCR識別妇汗。

然后我們通過一些小圖片示例去應(yīng)用Tesseract測試和評估這個OCR引擎的性能。

我們的結(jié)論顯示说莫,Tesseract在前景文本和背景色區(qū)分的非常清晰的圖片上工作非常好杨箭。實(shí)際上,保證這些類型的分割可能極具挑戰(zhàn)性储狭。因此互婿,我們傾向于訓(xùn)練特定領(lǐng)域的圖像分類器和檢測器。

然而辽狈,在我們需要將OCR應(yīng)用于我們自己的項(xiàng)目的情況下擒悬,我們了解如何通過Python編程語言訪問Tesseract OCR非常重要(前提是我們可以獲得Tesseract所需的漂亮,干凈的分段)稻艰。

涉及OCR的示例項(xiàng)目可能包括[構(gòu)建移動文檔掃描程序](https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/)您希望從中提取文本信息懂牧,或者您正在運(yùn)行掃描紙質(zhì)醫(yī)療記錄的服務(wù),并且您希望將信息放入符合HIPA的數(shù)據(jù)庫中尊勿。

在本章的其余部分僧凤,我們將學(xué)習(xí)如何安裝Tesseract OCR + Python“綁定”,然后編寫一個簡單的Python腳本來調(diào)用這些綁定元扔。在本教程結(jié)束時躯保,您將能夠?qū)D像中的文本轉(zhuǎn)換為Python字符串?dāng)?shù)據(jù)類型。

通過Python使用Tesseract OCR

本博客分為三部分澎语。

首先途事,我們將學(xué)會如何安裝pytesseract package 以便我們可以通過Python編程語言應(yīng)用Tesseract。

然后擅羞,我們將開發(fā)一個簡單的Python腳本來加載圖片尸变,二值化圖片并且將圖片傳給Tesseract OCR 系統(tǒng)。

最后减俏,我們將在一些示例圖像上測試我們的OCR管道并查看結(jié)果召烂。

在Python中綁定Tesseract

讓我們從安裝pytesseract開始吧。我們將利用pip來安裝pytesseract 娃承。

如果你使用的是虛擬環(huán)境(我強(qiáng)烈推薦這樣奏夫,以便您可以隔離不同的項(xiàng)目),使用workon命令為你的環(huán)境配置合適的名稱历筝。在這個例子中酗昼,我們的虛擬環(huán)境叫做cv

$ workon cv

接下來我們來安裝 Pillow梳猪,一個跟友好的pytesseract依賴的PIL端口麻削。

$ pip install pillow
$ pip install pytesseract

注意:pytesseract 并不是提供 一個真正的Python綁定。而是簡單的提供tesseract庫的接口。如果你看它在GitHub的項(xiàng)目你將發(fā)現(xiàn)該庫將圖像寫入磁盤上的臨時文件碟婆,然后在文件上調(diào)用tesseract二進(jìn)制文件并捕獲結(jié)果輸出电抚。這絕對有些取巧,但它為我們完成了工作竖共。

讓我們繼續(xù)蝙叛,查看一些將前景文本從背景中分割出來的代碼,然后使用我們新安裝的pytesseract公给。

使用Tesseract和Python應(yīng)用OCR

讓我們首先創(chuàng)建一個名字叫ocr.py 的新文件:

1. # import the necessary packages
2. from PIL import Image
3. import pytesseract
4. import argparse
5. import cv2
6. import os
7. 
8. # construct the argument parse and parse the arguments
9. ap = argparse.ArgumentParser()
10. ap.add_argument("-i", "--image", required=True,
     help="path to input image to be OCR'd")
11. ap.add_argument("-p", "--preprocess", type=str, default="thresh",
     help="type of preprocessing to be done")
12. args = vars(ap.parse_args())

2-6行是處理引用庫借帘。我們從硬盤加載圖片需要使用Image類,當(dāng)使用pytesseract時需要引入pytesseract庫淌铐。

9-14行是處理輸入的命令參數(shù)肺然,我們有2個入?yún)ⅲ?/p>

--image: 傳入給OCR系統(tǒng)的圖片路徑。

--preprocess:處理的方法腿准。這個是可選的開關(guān)际起,目前這個參數(shù)只接受2個值:thresh(閾值)或者blur。下面我們將要加載圖片吐葱,對圖片進(jìn)行二值化并且將結(jié)果寫入硬盤街望。

16. # load the example image and convert it to grayscale
17. image = cv2.imread(args["image"])
18. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
19.  
20. # check to see if we should apply thresholding to preprocess the
21. # image
22. if args["preprocess"] == "thresh":
23.     gray = cv2.threshold(gray, 0, 255,
24.     cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
25. 
26. # make a check to see if median blurring should be done to remove
27. # noise
28. elif args["preprocess"] == "blur":
29.     gray = cv2.medianBlur(gray, 3)
30.  
31. # write the grayscale image to disk as a temporary file so we can
32. # apply OCR to it
33. ilename = "{}.png".format(os.getpid())
34. cv2.imwrite(filename, gray)

首先,我們將--image參數(shù)的圖片從硬盤加載到內(nèi)存中(第17行)弟跑,接著對它進(jìn)行灰度處理灾前。(第18行

接下來,根據(jù)傳入的預(yù)處理參數(shù)孟辑,我們選擇threshold或者blur來處理圖片哎甲。這里我們可能需要添加更多的預(yù)處理方法處理超出本章范圍的情況。

第22-24行執(zhí)行threshold方法分離圖片的前景和背景饲嗽。我們通過使用 cv2.THRESH_BINARY 和 cv2.THRESH_OTSU標(biāo)志處理炭玫。更多細(xì)節(jié),請看在 official OpenCV documentation中查看*“Otsu’s Binarization”喝噪。

稍后我們將在結(jié)果部分中看到础嫡,這種閾值處理方法可用于讀取疊加在灰色形狀上的暗文本指么。

或者酝惧,可以應(yīng)用模糊方法。 當(dāng)--preprocess標(biāo)志設(shè)置為blur時伯诬,第28-29行執(zhí)行中值模糊晚唇。應(yīng)用中值模糊可以幫助減少鹽和胡椒的噪音,再次使Tesseract更容易正確地OCR圖像盗似。

在預(yù)處理圖片之后哩陕,我們使用os.getpid根據(jù)Python腳本的進(jìn)程ID派生臨時圖片文件名稱(33行)。

使用pytesseract進(jìn)行OCR之前的最后一步是將預(yù)處理后的圖像灰色寫入磁盤,并使用上面的文件名保存它(第34行)悍及。

我們最終可以使用Tesseract Python“綁定”將OCR應(yīng)用于我們的圖像:

36. # load the image as a PIL/Pillow image, apply OCR, and then delete
37. # the temporary file
38. text = pytesseract.image_to_string(Image.open(filename))
39. os.remove(filename)
40. print(text)
41. 
42. # show the output images
43. cv2.imshow("Image", image)
44. cv2.imshow("Output", gray)
45. cv2.waitKey(0)

第38行闽瓢,我們使用pytesseract.image_to_string方法將圖片內(nèi)容轉(zhuǎn)化為文本字符串。需要注意的是心赶,我們傳的是對圖片的臨時引用扣讼。

第39行,我們清除了臨時文件缨叫。

我們在40行打印出識別的文本到控制臺上椭符。在你自己的應(yīng)用中,你可能會想在這本上要做一些額外的處理耻姥。例如:拼寫錯誤檢查或者自然語言處理代替在控制臺輸出文本销钝,這些內(nèi)容我們將要在本章后面講解。

最后琐簇,第43和44行分別展示原始圖片和預(yù)處理后的圖片蒸健。43行的cv2.waitKey(0) 等待指令,等待從鍵盤輸入任意字符后退出程序婉商。

下面讓我們開始動手寫代碼纵装。

Python Tesseract OCR識別和結(jié)果

現(xiàn)在創(chuàng)建一個ocr.py的文件,是時候讓我們使用Python + Tesseract 針對一些示例圖片進(jìn)行OCR識別了据某。

在這個章節(jié)中我們將使用如下步驟嘗試OCR識別三個示例圖片:

首先橡娄,我們將按照Tesseract庫原樣運(yùn)行每個圖片。
然后癣籽,我們將運(yùn)行ocr.py腳本通過Tesseract實(shí)現(xiàn)預(yù)處理文件來處理每個圖片挽唉。
最后,我們將比較這兩種方法的結(jié)果并記錄任何錯誤筷狼。

我們第一個例子是一個“噪點(diǎn)”圖片瓶籽。此圖像包括我們期望的前景色是黑色的文本,背景色是部分白色和部分人工生成的灰色的圓點(diǎn)埂材∷芩常灰色的污點(diǎn)充當(dāng)我們算法的“干擾者”。


Noisy Image

我們可以使用Tesseract識別原始的俏险、未處理的圖片严拒。就像我們上一章的內(nèi)容

1. $ tesseract images/example_01.png stdout
2. Noisy image
3. to test
4. Tesseract OCR

Tesseract表現(xiàn)的非常好竖独,在這個例子中沒有任何錯誤裤唠。

現(xiàn)在讓我們確認(rèn)下我們新的腳本,ocr.py 莹痢,同樣運(yùn)行良好:

1. $ python ocr.py --image images/example_01.png
2. Noisy image
3. to test
4. Tesseract OCR
應(yīng)用ocr.py

正如您在此屏幕截圖中看到的那樣种蘸,閾值圖像非常清晰墓赴,背景已被刪除。我們的腳本正確地將圖像的內(nèi)容打印到控制臺航瞭。

接下來诫硕,讓我們在背景中的“鹽和胡椒”噪聲圖像上測試Tesseract和我們的預(yù)處理腳本:

“鹽和胡椒”噪聲圖像

我們可以在下面看到tesseract的輸出結(jié)果:

1. $ tesseract images/example_02.png stdout
2. Detected 32 diacritics
3. " Tesséra‘c't Will
4. Fail With Noisy
5. Backgrounds

不幸的是,Tesseract沒有成功地對圖像中的文本進(jìn)行OCR識別刊侯。

但是痘括,通過在ocr.py中使用模糊預(yù)處理方法,我們可以獲得更好的結(jié)果:

1. $ python ocr.py --image images/example_02.png --preprocess blur
2. Tesseract Will
3. Fail With Noisy
4. Backgrounds
模糊預(yù)處理方法識別圖片

成功了滔吠!通過模糊預(yù)處理步驟使Tesseract正確的識別和輸出我們期望的文本纲菌。

最后,讓我們嘗試另外一個圖片疮绷,這個圖片有更多的文本:


更多文本的圖片

以上圖片是我的書Practical Python and OpenCV 中的*“Prerequisites” *章節(jié)截圖翰舌。讓我們來看看Tesseract如何處理這個圖片:

1. $ tesseract images/example_03.png stdout
2. PREREQUISITES
3.  
4. In order In make the rnosi of this, you will need (a have
5. a little bit of pregrarrmung experience. All examples in this
6. book are in the Python programming language. Familiarity
7. with Pyihon or other scriphng languages is suggesied, but
8. mm required.
9.  
10. You'll also need (a know some basic mathematics. This
11. book is handson and example driven: leis of examples and
12. lots of code, so even if your math skills are noi up to par.
13. do noi worry! The examples are very damned and heavily
14. documented (a help yuu follaw along.

然后使用ocr.py測試圖像:

1. $ python ocr.py --image images/example_03.png
2. PREREQUISITES
3.  
4. Lu order to make the most ol this, you will need to have
5. a little bit ol programming experience. All examples in this
6. book are in the Python programming language. Familiarity
7. with Python or other scripting languages is suggested, but
8. not requixed.
9.  
10. You’ll also need to know some basic mathematics. This
11. book is handson and example driven: lots of examples and
12. lots ol code, so even ii your math skills are not up to par,
13. do not worry! The examples are very detailed and heavily
14. documented to help you tollow along.
識別結(jié)果

注意兩個輸出中的拼寫錯誤,包括但不限于“In”冬骚,“of”椅贱,“required”“programming”只冻,“follow”庇麦。

兩者的輸出都不匹配;然而喜德,有趣的是山橄,預(yù)處理版本只有8個字錯誤,而非預(yù)處理圖像有17個字錯誤(錯誤數(shù)量超過兩倍)舍悯。 我們的預(yù)處理可以幫助非干凈的背景條件下識別文字航棱!

Python + Tesseract在這里做了一個合理的工作,但我們再一次證明了庫作為現(xiàn)成的分類器的局限性萌衬。

我們可以使用Tesseract for OCR獲得良好或可接受的結(jié)果饮醇,但最佳準(zhǔn)確度將來自在實(shí)際真實(shí)世界圖像中出現(xiàn)的特定字體集上的自定義字符分類器上的訓(xùn)練。

不要讓Tesseract OCR的結(jié)果讓您失望 - 只需管理您的期望并對Tesseract的表現(xiàn)保持現(xiàn)實(shí)秕豫。沒有真正的“現(xiàn)成”O(jiān)CR系統(tǒng)可以為您提供完美的結(jié)果(肯定會有一些錯誤)朴艰。

注意:如果您的文字被輪換,您可能希望進(jìn)行額外的預(yù)處理混移,如之前關(guān)于糾正文本偏斜的博客文章中所執(zhí)行的那樣祠墅。否則,如果您對構(gòu)建[移動文檔掃描程序](https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/ )感興趣沫屡,你現(xiàn)在有一個相當(dāng)不錯的OCR系統(tǒng)可以集成到它中饵隙。

摘要

在今天的博客文章中,我們學(xué)習(xí)了如何將Tesseract OCR引擎應(yīng)用于Python編程語言沮脖。這使我們能夠在我們的Python腳本中應(yīng)用來自within的OCR算法金矛。

最大的缺點(diǎn)是Tesseract本身的局限性。當(dāng)前景文本中有 干凈分割時勺届,Tesseract效果最佳驶俊。

此外,這些分割需要盡可能高的分辨率(DPI)輸入圖像中的字符在分割后不會出現(xiàn)“像素化”免姿。如果字符確實(shí)出現(xiàn)像素化饼酿,那么Tesseract將難以正確識別文本 - 即使應(yīng)用在理想條件下捕獲的圖像(PDF截圖),我們也發(fā)現(xiàn)了這一點(diǎn)胚膊。

OCR雖然不再是一項(xiàng)新技術(shù)故俐,但仍然是計算機(jī)視覺文獻(xiàn)研究的一個活躍領(lǐng)域*尤其是在將OCR應(yīng)用于真實(shí)世界的無約束圖像時。深度學(xué)習(xí)和卷積神經(jīng)網(wǎng)絡(luò)(CNN)無疑使我們能夠獲得更高的準(zhǔn)確度紊婉,但我們距離看到“接近完美”的OCR系統(tǒng)還有很長的路要走药版。此外,由于OCR在許多域中具有許多應(yīng)用程序喻犁,因此用于OCR的一些最佳算法是商業(yè)性的槽片,并且需要許可才能在您自己的項(xiàng)目中使用。

在將OCR應(yīng)用于自己的項(xiàng)目時肢础,我向讀者提出的主要建議是首先嘗試使用Tesseract还栓,如果結(jié)果不合適,請轉(zhuǎn)到Google Vision API传轰。

如果* Tesseract Google Vision API 都沒有獲得合理的準(zhǔn)確度剩盒,您可能需要重新評估數(shù)據(jù)集并確定是否值得培訓(xùn)自己的自定義字符分類器 - 這尤其是如果*為真您的數(shù)據(jù)集有噪音和/或包含您希望檢測和識別的特定字體。特定字體的示例包括信用卡上的數(shù)字慨蛙,在支票底部找到的帳戶和路由號碼勃刨,或圖形設(shè)計中使用的程式化文本。

我希望你能在Python和OpenCV上享受關(guān)于光學(xué)字符識別(OCR)的一系列博客文章股淡!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末身隐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唯灵,更是在濱河造成了極大的恐慌贾铝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埠帕,死亡現(xiàn)場離奇詭異垢揩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敛瓷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門叁巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呐籽,你說我怎么就攤上這事锋勺∈慈常” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵庶橱,是天一觀的道長贮勃。 經(jīng)常有香客問我,道長苏章,這世上最難降的妖魔是什么寂嘉? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮枫绅,結(jié)果婚禮上泉孩,老公的妹妹穿的比我還像新娘。我一直安慰自己并淋,他們只是感情好寓搬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著预伺,像睡著了一般订咸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酬诀,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天脏嚷,我揣著相機(jī)與錄音,去河邊找鬼瞒御。 笑死父叙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肴裙。 我是一名探鬼主播趾唱,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜻懦!你這毒婦竟也來了甜癞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宛乃,失蹤者是張志新(化名)和其女友劉穎骇陈,沒想到半個月后铛只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體足绅,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吼鱼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谆奥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眼坏。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酸些,靈堂內(nèi)的尸體忽然破棺而出宰译,到底是詐尸還是另有隱情檐蚜,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布囤屹,位于F島的核電站熬甚,受9級特大地震影響逢渔,放射性物質(zhì)發(fā)生泄漏肋坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一肃廓、第九天 我趴在偏房一處隱蔽的房頂上張望智厌。 院中可真熱鬧,春花似錦盲赊、人聲如沸铣鹏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诚卸。三九已至,卻和暖如春绘迁,著一層夾襖步出監(jiān)牢的瞬間合溺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工缀台, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棠赛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓膛腐,卻偏偏與公主長得像睛约,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哲身,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容