當前位置:
首頁 > 知識 > 用python和Tesseract實現光學字元識別(OCR)

用python和Tesseract實現光學字元識別(OCR)


Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。



在上周的博客中我們學會了安裝光學字元識別程序Tesseract,以及應用Tesseract程序來測試和評估OCR引擎在一小部分示例圖像上的性能。


正如結果所示,當從背景中分離出前景文本時,Tesseract的效果最佳。實際上這是非常有挑戰性的。因此,我們傾向於訓練特定領域的圖像分類器和識別器。然而,在我們將OCR應用於我們自己的項目之前,我們需要了解如何通過Python編程語言來實現Tesseract OCR。涉及OCR的示例項目可能包括構建一個移動文檔掃描器,您希望從中提取文本信息,或者您正在運行掃描紙質醫療記錄的服務,並且希望將信息放入符合HIPA的資料庫。


在接下來的部分,我們將學習如何安裝Tesseract OCR 和Python,然後編寫一個簡單的Python腳本來調用這些程序。本教程結束之後,您將能夠將圖像中的文本轉換為Python字元串數據類型。


使用Tesseract-OCR和python


本文分成以下三個部分:
    1、學習安裝pythesseract軟體包,以便我們可以通過Python編程語言訪問Tesseract。
    2、開發一個簡單的Python腳本來載入圖像,將圖像轉換成二進位文件,並將其傳遞給Tesseract OCR系統。
    3、將在一些示例圖像上測試OCR,並查看結果。


安裝Tesseract + Python組合


我們先來看看pytesseract的安裝。要安裝pythesseract,我們將利用pip。


如果您正在使用虛擬環境(我強烈建議您分開不同的項目),請使用workon命令,然後緊跟虛擬環境的名稱。在本例中,我們的虛擬環境名為cv。




接下來安裝pillow和pytesseract




注意:

pytesseract不提供真正的Python功能。相反,它只是為tesseract二進位文件提供一個介面。如果您查看GitHub上的源碼,您將看到該庫只是將圖片寫入磁碟上的臨時文件,然後調用tesseract二進位文件並捕獲結果輸出。這絕對有點黑客,但是它為我們完成了這項工作。


我們來回顧一下從背景中分割前景文字的代碼,然後利用我們剛剛安裝的pytesseract


用Tesseract-OCR和python實現OCR



首先創建一個ocr.py文件:




2到6行是導入的包,image類用以從硬碟載入PIL格式的的圖像。
9到14行是命令行參數,主要有以下兩個:
    

--image:

傳遞給OCR系統圖片的路徑
    

--preprocess:

  預處理方法。此項是可選的,對於本教程,可以接受兩個值:

thresh

blur


接下來,我們將載入圖像,將其二進位化並將其寫入磁碟。




首先, 從磁碟載入圖像到內存,然後將其轉換為灰度圖。接下來,根據我們的命令行參數指定預處理方法,設置閾值。在這裡您可以添加更多高級預處理方法(取決於您的OCR的具體應用),不過這超出了本文的範圍。


行22-24上的if語句執行閾值,以便從背景分割前景。我們使用cv2.THRESH_BINARY和cv2.THRESH_OTSU標誌來執行此操作。有關Otsu方法的詳細信息,請參閱官方OpenCV文檔中的「Otsu二進位」。

稍後我們將在結果中看到,這種閾值方法可用於讀取覆蓋在灰色形狀上的深色文本,或者,可以應用模糊方法。 28-29行在--preprocess標誌設置為blur。應用blur可以幫助減少雜訊,使Tesseract更容易正確地識別OCR圖像。在預處理圖像後,根據Python腳本的進程ID用os.getpi導出臨時圖像文件名。在使用pytesseract進行OCR之前的最後一步是將預處理的圖像(灰色)寫入磁碟,並使用上面的文件名保存它


最後我們可以使用Tesseract Python組合將OCR應用於我們的圖像:




在第38行使用pytesseract.image_to_string將圖像的內容轉換成我們所需的字元串,文本。請注意,我們傳遞了對駐留在磁碟上的臨時映像文件的引用。接下來是第39行的一些清理,刪除臨時文件。


第40行是向終端列印文字的地方。在您自己的應用程序中,您可能希望在這裡進行一些額外的處理,例如拼寫檢查OCR錯誤或自然語言處理,而不是像本教程中一樣將其列印到終端。

最後,第43行和第44行在單獨的窗口中顯示原始圖像和預處理圖像。第34行的cv2.waitKey(0)表示我們應該等到鍵盤上的鍵退出腳本之前被按下。


接下來看下結果。


Tesseract-OCR和python的結果


現在已經創建了ocr.py,是時候將Python 和 Tesseract應用到示例圖像上實現OCR了。
在本節中,我們將嘗試使用以下過程完成三個示例圖像的OCR識別:
    1、首先,對每幅圖運行Tesseract二進位程序;
    2、然後運行ocr.py(在通過Tesseract發送之前執行預處理操作)
    3、最後,我們將比較這兩種方法的結果,並記錄錯誤的地方。


我們的第一個例子是關於「noisy」的圖像。此圖像包含我們所需的前景黑色文字,背景部分為白色,部分散布有人為生成的圓形斑點。這些斑點作為演算法的「干擾物」。




使用上周學到的Tesseract二進位程序,可以將OCR應用於未預先處理的圖像:




本例中Tesseract表現良好,沒有錯誤。
現在來確認新創建的腳本ocr.py是否能正常工作





正如在此截圖中可以看到的,閾值圖像非常清楚,背景已被刪除。我們的腳本將圖像的內容正確的列印到終端。
接下來測試Tesseract和我們的預處理腳本在雜亂背景中的圖像效果。




下面我們可以看到tesseract的輸出




不幸的是,Tesseract沒有成功地識別出圖像中的文本。然而,通過在ocr.py中使用"blur"預處理方法,我們可以獲得更好的結果:





成功!我們的模糊預處理步驟使Tesseract正確地輸出我們所需的文本。最後,讓我們試試另一個更多文字的圖片。





上面的圖片是我的書「Practical  Python  and  OpenCV」中的部分截圖 ,讓我們看看Tesseract處理這個圖片的效果




隨後用ocr.py測試圖像:





注意兩個輸出中的拼寫錯誤,不止有「In」,「of」,「required」,「programming」和「follow」。


這兩者的輸出不一樣;然而有趣的是,預處理版本只有8個字錯誤,而未預處理的圖像具有17個字錯誤(超過兩倍的錯誤)。看來我們的預處理有助於獲得乾淨的背景!Python 和 Tesseract在這裡做了一個合理的工作,但是我們再次看到這個庫作為一個現成分類器的局限性。


我們可以通過Tesseract獲得一個可接受的結果,但是最好的結果來自對真實世界圖像中出現的特定字符集訓練的自定義分類器。不要讓Tesseract OCR的結果阻止您進行下一步的願望,只需按照實際需求,讓Tesseract表現出更加的效果。記住,沒有一個真正「現成」的OCR系統,它需要你不斷的探索嘗試。


注意:

如果您的文本需要旋轉,您需要進行額外的預處理,就像在之前的博客文章中對糾正文本偏斜所做的那樣。沒有的話您就可以構建一個不錯的移動文檔掃描程序,而且OCR系統集成到其中。


總結



在今天的博文中,我們學習了如何使用Python編程語言應用Tesseract OCR引擎。這使我們能夠在我們的Python腳本中應用OCR演算法。最大的缺點是Tesseract本身的局限性。當背景中的前景文本非常乾淨時,Tesseract的效果最好。


此外,背景與文字需要儘可能高的解析度(DPI),並且輸入圖像中的字元在分離之後不會出現「像素化」。如果文字出現像素化,那麼Tesseract將難以正確識別文本,即使在理想條件下拍攝的圖像(PDF截圖)也會出現同樣的問題。


雖然OCR不再是一門新技術,但仍然是計算機視覺文獻研究的活躍領域,特別是當將OCR應用於現實世界的無約束圖像時。深度學習和卷積神經網路(CNN)可以使我們獲得更高的準確性,但是我們還遠遠沒有看到「接近完美」的OCR系統。此外,由於OCR在許多領域具有許多應用,所以一些最佳的OCR演算法都是商業化的,需要許可才能應用到自己的項目中。


在將OCR應用於自己的項目時,我的主要建議是首先嘗試Tesseract,如果結果不合適就轉移到Google Vision API。如果Tesseract和Google Vision API都沒有獲得合理的準確性,您可能需要重新評估數據集,並決定是否值得培養自己的自定義字元分類器,尤其是你希望檢測並識別非常具體的字體。這些特定字體的示例包括信用卡上的數字,支票底部找到的帳戶和路由號碼,或圖形設計中使用的風格化文本。


非常感謝你能分享這個系列的光學字元識別(OCR)博客文章!





英文原文:http://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/


譯者:咋家



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python程序員 的精彩文章:

尾遞歸 —— 寫給命令式編程程序員
通俗易懂,學習網站及後台開發,今日9折
1分鐘告訴你什麼是CDN?
翻譯社有10個任務待認領
MNIST入門:貝葉斯方法

TAG:Python程序員 |

您可能感興趣

用Pytorch 實現的 Capsule Network
SpaceTime Enterprises 用VR實現你的太空夢
SAP Cloud for Customer Extensibility的設計與實現
利用谷歌object detection API實現Oxford-IIIT Pets Dataset 目標檢測趟坑記錄
使用Tensorflow Object Detection API實現對象檢測
用TensorFlow Estimator實現文本分類
用PaddlePaddle和Tensorflow實現GoogLeNet InceptionV2/V3/V4
AspectJ 框架 spring 實現 AOP?
用Scratch+IBM Watson實現機器學習
NET Core微服務之基於Ocelot+IdentityServer實現統一驗證與授權
Ceilometer和Monasca 能幫OpenStack實現智能運維
PS4終於實現了Fortnite cross-play功能
Github 項目推薦 用PyTorch 實現 OpenNMT
Machine Learning(一):基於 TensorFlow 實現寵物血統智能識別
連發Science、Nature Physics:谷歌展示量子霸權實現藍圖
基於google protobuf的gRPC實現
Yaw VR登陸Kickstarter,可實現3DoF追蹤
在Spark 上實現 TensorFlow 的庫——Sparkflow
ArrayList,LinkedList,Vector基本原理與實現
Python商務辦公——python+pandas高效實現Excel文件合併與分析