在Python中使用Tesseract進行OCR識別

本教程翻譯自PyImageSearch英文原文

Tesseract OCR

上周的博客內(nèi)容,我們學習了如何安裝Tesseract去做OCR識別。

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

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

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

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

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

通過Python使用Tesseract OCR

本博客分為三部分。

首先,我們將學會如何安裝pytesseract package 以便我們可以通過Python編程語言應用Tesseract。

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

最后,我們將在一些示例圖像上測試我們的OCR管道并查看結果。

在Python中綁定Tesseract

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

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

$ workon cv

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

$ pip install pillow
$ pip install pytesseract

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

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

使用Tesseract和Python應用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類,當使用pytesseract時需要引入pytesseract庫。

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

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

--preprocess:處理的方法。這個是可選的開關,目前這個參數(shù)只接受2個值:thresh(閾值)或者blur。下面我們將要加載圖片,對圖片進行二值化并且將結果寫入硬盤。

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行),接著對它進行灰度處理。(第18行

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

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

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

或者,可以應用模糊方法。 當--preprocess標志設置為blur時,第28-29行執(zhí)行中值模糊。應用中值模糊可以幫助減少鹽和胡椒的噪音,再次使Tesseract更容易正確地OCR圖像。

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

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

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

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)容轉化為文本字符串。需要注意的是,我們傳的是對圖片的臨時引用。

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

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

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

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

Python Tesseract OCR識別和結果

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

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

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

我們第一個例子是一個“噪點”圖片。此圖像包括我們期望的前景色是黑色的文本,背景色是部分白色和部分人工生成的灰色的圓點?;疑奈埸c充當我們算法的“干擾者”。


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)在讓我們確認下我們新的腳本,ocr.py ,同樣運行良好:

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

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

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

“鹽和胡椒”噪聲圖像

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

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

不幸的是,Tesseract沒有成功地對圖像中的文本進行OCR識別。

但是,通過在ocr.py中使用模糊預處理方法,我們可以獲得更好的結果:

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

成功了!通過模糊預處理步驟使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.
識別結果

注意兩個輸出中的拼寫錯誤,包括但不限于“In”,“of”“required”,“programming”,“follow”。

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

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

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

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

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

摘要

在今天的博客文章中,我們學習了如何將Tesseract OCR引擎應用于Python編程語言。這使我們能夠在我們的Python腳本中應用來自within的OCR算法。

最大的缺點是Tesseract本身的局限性。當前景文本中有 干凈分割時,Tesseract效果最佳。

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

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

在將OCR應用于自己的項目時,我向讀者提出的主要建議是首先嘗試使用Tesseract,如果結果不合適,請轉到Google Vision API。

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

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容