python - 为什么 pytesseract 无法识别背景较暗的图像中的数字?

标签 python python-3.x ocr python-tesseract

我有这个 python 代码,我用它来将图片中的文本转换为字符串,它确实适用于某些具有大字符的图像,但不适用于我现在正在尝试的仅包含数字的图像.

这是图片:

Digits

这是我的代码:

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 中是对称处理的,因此黑色背景上的白色数字不是问题。

关于python - 为什么 pytesseract 无法识别背景较暗的图像中的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55994807/

相关文章:

python - 如何使用python opencv和anaconda为两张图片创建一个新的交错图像

OpenCV 颜色浓度直方图

python - 预期 ndim=3,发现 ndim=2

python - 从优先级队列中删除任意项

python - 确定表达式中是否按下了键 (Python) (PyQT)

python - 在 Tornado 中将 HTTP 请求重定向到 HTTPS

javascript - 谷歌应用程序脚本: how to convert PDF to GDOC in order to get OCR?

android - 增强 TessBaseAPI.getUTF8Text() 的可读性

python - cpython:何时调用 PyDict_GetItem 以及何时调用 dict_subscript?

python - 为什么 Pandas 和 R 之间数据帧的内存使用量有如此大的差异?