使用Python,OpenCV进行Tesseract-OCR绑定及识别
使用Python,OpenCV進行Tesseract-OCR綁定及識別
- 1. 效果圖
- 2. 安裝Tesseract+Python“綁定”及識別
- 3. 源碼
- 參考
上一篇博客介紹了Windows上Tesseract-OCR的安裝,并使用命令行參數(shù)進行了OCR數(shù)字和字母的識別。這一篇將介紹如何使用Python應用Tesseract-OCR綁定,并進行圖像上字符的識別。當前景文本與背景進行(非常)清晰的分割時,Tesseract-OCR將獲得好的效果。
-
最大的缺點是Tesseract本身的局限性。當前景文本與背景之間有非常清晰的分割時,Tesseract效果最佳。
-
這些分割需要盡可能高的分辨率(DPI),并且分割后輸入圖像中的字符不能出現(xiàn)“像素化”。如果字符確實出現(xiàn)像素化,那么Tesseract將難以正確識別文本。
-
將OCR應用于真實世界的無約束圖像時,仍有挑戰(zhàn)。深度學習和卷積神經(jīng)網(wǎng)絡(CNN)將能夠獲得更高的精度
-
在將OCR應用于項目時,建議首先嘗試Tesseract,如果結果不理想,可使用Google 在線API。
-
如果Tesseract和Google Vision API都沒有獲得合理的準確度,則需要重新評估數(shù)據(jù)集,并決定是否要培訓自定義字符分類器。
1. 效果圖
原始圖如下:
命令行Tesseract-OCR結果如圖:
tesseract版本 v5.0.0,可以看到高于v4,使用的是長短時記憶(LSTM)OCR模型,該模型比Tesseract的早期版本精確得多!
Python+Tessearct-OCR綁定識別,預處理(閾值化)后的效果圖如下:
可以看到閾值化后的圖像相當清晰,分辨率也很高,因此成功識別。
Python+Tessearct-OCR綁定識別,預處理(中值模糊)后的效果圖如下:
可以看到成功識別~
效果圖2——原始圖VS 閾值化后的圖像:
噪音更多一些的Tesseract-OCR命令行也能成功識別:
python+Tesseract-OCR預處理(閾值化后)識別效果圖如下:
python+Tesseract-OCR預處理(中值模糊后)識別效果圖如下:
可以看到中值模糊后有不少噪音,依然成功識別~
更多的文本也可以成功識別,Python+Tesseract-OCR效果圖如下:
2. 安裝Tesseract+Python“綁定”及識別
- 安裝pillow,它是一個對Python更友好的PIL(一個依賴項)端口
- 安裝tesseract
pip install pillow
pip install pytesseract
pytesseract 不提供真正的Python綁定。相反,它只是提供了一個到tesseract的調(diào)用映射接口。然后調(diào)用tesseract二進制文件,并捕獲結果輸出。
可以使用Tesseract for OCR獲得良好或可接受的結果,但最好的準確度將來自對實際圖像中出現(xiàn)的特定字體集的自定義字符分類器進行訓練。
通過升級Tesseract版本來提高OCR準確性。
如果在輸出中看到Tesseract v4或更高版本,則使用的是長短時記憶(LSTM)OCR模型,該模型比Tesseract的早期版本精確得多!
如果看到任何低于v4的版本,則應升級Tesseract安裝-使用Tesseract v4 LSTM引擎將獲得更準確的OCR結果。
3. 源碼
# 使用pytesseract調(diào)用tesseract-ocr進行OCR識別
# 命令行ocr
# tesseract D:\deepLearning\py-demo\20210822\images\example_01.png stdout# USAGE
# python ocr.py --image images/example_01.png
# python ocr.py --image images/example_01.png --preprocess blur# 導入必要的包
from PIL import Image #以PIL格式加載磁盤圖像
import pytesseract
import argparse
import cv2
import os# 構建命令行參數(shù)及解析
# --image 輸入圖像路徑
# --preprocess:預處理類型,thresh或blur
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input image to be OCR'd")
ap.add_argument("-p", "--preprocess", type=str, default="thresh",help="type of preprocessing to be done")
args = vars(ap.parse_args())# 加載圖像并轉換為灰度圖
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 預處理以便將前景與背景分割開來
# 檢測是該用閾值還是模糊預處理步驟
if args["preprocess"] == "thresh":gray = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# 檢測是否應該用中值模糊
# 應用中值模糊有助于減少椒鹽噪聲,使Tesseract更容易正確地對圖像進行OCR。
elif args["preprocess"] == "blur":gray = cv2.medianBlur(gray, 3)# 將灰度圖臨時寫入磁盤以調(diào)用OCR識別
filename = "{}.png".format(os.getpid())
cv2.imwrite(filename, gray)# 以PIL(pillow)格式加載圖像,應用OCR,刪除臨時文件
# 將圖像的內(nèi)容轉換為所需的字符串文本
text = pytesseract.image_to_string(Image.open(filename))
os.remove(filename)
# 輸出識別的文本值
print(text)# 展示原始圖像和預處理圖像
cv2.imshow("Image", image)
cv2.imshow("Output", gray)
cv2.waitKey(0)
參考
- eng.traineddata,chi_sm.traineddata語言訓練包下載
- https://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/
- https://github.com/UB-Mannheim/tesseract/wiki
總結
以上是生活随笔為你收集整理的使用Python,OpenCV进行Tesseract-OCR绑定及识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用KMeanCluster对多个区域进
- 下一篇: Java 使用itextPdf7操作pd