簡體   English   中英

為什么 pytesseract 無法識別背景較暗的圖像中的數字?

[英]Why does pytesseract fail to recognise digits from image with darker background?

我有這個 python 代碼,我用來將寫在圖片中的文本轉換為字符串,它確實適用於某些具有大字符的圖像,但不適用於我現在正在嘗試的僅包含數字的圖像。

這是圖片:

數字

這是我的代碼:

import pytesseract
from PIL import Image

img = Image.open('img.png')
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
result = pytesseract.image_to_string(img)
print (result)

為什么無法識別此特定圖像,我該如何解決此問題?

我有兩個建議。

首先,這是迄今為止最重要的,在 OCR 中預處理圖像是獲得良好結果的關鍵。 在你的情況下,我建議二值化。 您的圖像看起來非常好,所以您不應該有任何問題,但如果您有問題,那么也許您應該嘗試對圖像進行二值化:

import cv2
from PIL import Image

img = cv2.imread('gradient.png')
# If your image is not already grayscale :
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold = 180 # to be determined
_, img_binarized = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
pil_img = Image.fromarray(img_binarized)

然后使用二值化圖像再次嘗試 ocr。

檢查您的圖像是否為灰度圖像,並在需要時取消注釋。

這是簡單的閾值。 自適應閾值也存在,但它很嘈雜,並且不會為您帶來任何好處。

Tesseract 更容易處理二值化圖像。 這已經在內部完成( https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality )但有時事情可能會搞砸,而且通常進行自己的預處理很有用。

您可以通過查看圖像來檢查閾值是否正確:

import matplotlib.pyplot as plt
plt.imshow(img, cmap='gray')
plt.imshow(img_binarized, cmap='gray')

其次,如果我上面說的仍然不起作用,我知道這不能回答“為什么 pytesseract 在這里不起作用”,但我建議您嘗試使用 tesserocr。 它是 Tesseract 的維護 Python 包裝器。

你可以試試:

import tesserocr
text_from_ocr = tesserocr.image_to_text(pil_img)

這是來自 pypi 的 tesserocr 文檔: https ://pypi.org/project/tesserocr/

而對於 opencv: https : //pypi.org/project/opencv-python/

附帶說明一下,在 Tesseract 中,黑色和白色是對稱處理的,因此黑色背景上的白色數字不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM