【问题标题】:PyTesseract not recognising imagesPyTesseract 无法识别图像
【发布时间】:2017-11-19 16:02:28
【问题描述】:

我目前面临 pytesseract 的问题,该软件无法检测到此图像中的数字:

https://i.stack.imgur.com/kmH2R.png

这是从应用了阈值过滤器的较大图像中获取的。

出于某种原因,pytesseract 不想识别此图像中的 6。有什么建议?这是我的代码:

image = #Insert raw image here. My code takes a screenshot.
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
image = cv2.medianBlur(image, 3)
rel, gray = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# If you want to use the image from above, start here.
image = Image.fromarray(image)
string = pytesseract.image_to_string(image)
print(string)

编辑:通过进一步调查,我的代码在包含 2 位数字的情况下运行良好。但不是那些有单数的。

【问题讨论】:

    标签: python opencv python-tesseract


    【解决方案1】:

    pytesseract 默认为查找大块文本的模式(PSM_SINGLE_BLOCK 或 --psm 6),为了让它检测到单个字符,您需要使用选项 --psm 10 (PSM_SINGLE_CHAR) 运行它。但是,由于您提供的图像角落中的黑点,它会将它们检测为随机破折号并且在此模式下不返回任何内容,因为它有多个字符,因此在这种情况下您需要使用 --psm 8 (PSM_SINGLE_WORD):

    string = pytesseract.image_to_string(image, config='--psm 8')

    由此产生的输出将包括那些随机字符,因此您需要在 pytesseract 运行后剥离它们或改进数字周围的边界框以消除任何噪音。此外,如果检测到的所有字符都是数字,您可以在“--psm 8”之后添加“-c tessedit_char_whitelist=0123456789”以改进检测。


    简化代码的其他一些小技巧是 cv2.imread 可以选择将图像读取为黑白,因此您无需在之后运行 cvtColor,只需执行以下操作:

    image = cv2.imread('/path/to/image/6.png', 0)

    您也可以在对 pytesseract 的调用中创建 PIL 图像对象,以便该行简化为:

    string = pytesseract.image_to_string(Image.fromarray(img), config='--psm 8')

    只要您的脚本顶部有“from PIL import Image”。

    【讨论】:

    • 是“Image.Image.fromarray”还是只是“Image.fromarray”?
    • 取决于你如何在 Python 脚本中导入 PIL,如果你做import PIL as Image,那么你需要Image.Image.fromarray,但是如果你做from PIL import Image,那么你只需要写Image.fromarray。现在再次查看 Pillow 的文档,看起来他们通常使用第二种方式,所以我会更新我的帖子以匹配它。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多