为啥 pytesseract 无法识别背景较暗的图像中的数字?
Posted
技术标签:
【中文标题】为啥 pytesseract 无法识别背景较暗的图像中的数字?【英文标题】:Why does pytesseract fail to recognise digits from image with darker background?为什么 pytesseract 无法识别背景较暗的图像中的数字? 【发布时间】:2019-09-23 11:25:24 【问题描述】:我有这个 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)
为什么无法识别这个特定的图像,我该如何解决这个问题?
【问题讨论】:
您可以尝试限制字符的样本空间,只允许数字作为输出。更多关于这个whitelisting characters in pytesseract 【参考方案1】:我有两个建议。
首先,这是迄今为止最重要的,在 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 中被对称处理,因此黑色背景上的白色数字不是问题。
【讨论】:
感谢您提供宝贵的信息,我会检查一下,我知道有一个特定的配置,所以我可以得到我的结果,这个网站可以为我完成这项工作:smallseotools.com/image-to-text-converter 但我我正在尝试仅将 python 用于一个项目。 绝大多数在线 OCR(有些不错,但不是全部)工具在后台使用 Tesseract。这意味着您理论上可以自己做,但使用 Tesseract 可能非常困难,实际上通过找到正确的配置可以获得非常好的结果。尽管如此,即使是嘈杂的文档,您仍然可以获得不错的结果,并且由于您的图像非常好,您可能/应该能够获得清晰的结果。以上是关于为啥 pytesseract 无法识别背景较暗的图像中的数字?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS7 的 UIPopoverController 中禁用较暗的透明效果?