使用pytesseract的image_to_osd方法时出现错误

8

这是我的代码:

import pytesseract
import cv2
from PIL import Image

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"


def main():
    original = cv2.imread('D_Testing.png', 0)
    # binary thresh it at value 100. It is now a black and white image
    ret, original = cv2.threshold(original, 100, 255, cv2.THRESH_BINARY)
    text = pytesseract.image_to_string(original, config='--psm 10')
    print(text)
    print(pytesseract.image_to_osd(Image.open('D_Testing.png')))


if __name__ == "__main__":
    main()

对于第一个输出,我得到了我需要的字母D。

D

这是预期的结果,但当它尝试执行第二个打印语句时,会输出以下内容。

Traceback (most recent call last):
  File "C:/Users/Me/Documents/Python/OpenCV/OpenCV_WokringTest/PytesseractAttempt.py", line 18, in <module>
    main()
  File "C:/Users/Me/Documents/Python/OpenCV/OpenCV_WokringTest/PytesseractAttempt.py", line 14, in main
    print(pytesseract.image_to_osd(Image.open('D_Testing.png')))
  File "C:\Users\Me\Documents\Python\OpenCV\OpenCV_WokringTest\venv\lib\site-packages\pytesseract\pytesseract.py", line 402, in image_to_osd
    }[output_type]()
  File "C:\Users\Me\Documents\Python\OpenCV\OpenCV_WokringTest\venv\lib\site-packages\pytesseract\pytesseract.py", line 401, in <lambda>
    Output.STRING: lambda: run_and_get_output(*args),
  File "C:\Users\Me\Documents\Python\OpenCV\OpenCV_WokringTest\venv\lib\site-packages\pytesseract\pytesseract.py", line 218, in run_and_get_output
    run_tesseract(**kwargs)
  File "C:\Users\Me\Documents\Python\OpenCV\OpenCV_WokringTest\venv\lib\site-packages\pytesseract\pytesseract.py", line 194, in run_tesseract
    raise TesseractError(status_code, get_errors(error_string))
pytesseract.pytesseract.TesseractError: (1, 'Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica Warning: Invalid resolution 0 dpi. Using 70 instead. Too few characters. Skipping this page Warning. Invalid resolution 0 dpi. Using 70 instead. Too few characters. Skipping this page Error during processing.'). 

我不确定该怎么办。在网上找不到太多关于这个错误的信息。同时,我也不知道该怎么做。目标只是为了输出我的信件的方向。提前感谢所有有帮助的评论!


如果您将预处理的“原始”数据传递给“image_to_osd”,会发生什么? - Dmitrii Z.
这是我正在传递的图像:https://i.stack.imgur.com/R3nzH.png - Bob Stoops
好的,如果您将预处理后的图像(original)传递给 image_to_osd 而不是未经处理的图像(Image.open('D_Testing.png')),会发生什么? - Dmitrii Z.
仍然不幸运地无法工作。 - Bob Stoops
这是因为它无法从您的图像中提取dpi信息。https://github.com/tesseract-ocr/tesseract/issues/1702 - alyssaeliyah
1
遇到了类似的问题,通过在 pytesseract 函数中传递 --dpiconfig 中解决了它。image = Image.open(path) config_str = '--dpi ' + str(image.info['dpi'][0]) text = pytesseract.image_to_string(image , config=config_str) - mbauer
3个回答

6
面对这个问题,我尝试了不同的方法,最终解决了它!只需直接传递图像位置,而不是通过Pillow或OpenCV进行,如@Esraa Abdelmaksoud所述。
text = pytesseract.image_to_osd(r'Report 2.jpeg')

我遇到了同样的情况。如果我通过PIL打开图像,pytesseract会抛出错误,无法检测DPI、格式,然后报告字符太少。但是,如果将图像作为路径传递,它就可以立即工作。在我的情况下,这是有问题的,因为我首先要增强图像,所以我不想保存它再重新打开它:\ 有其他人对此有解释吗? - CBallenar

4

Tesseract OSD 通过使用图像中识别出的字符来检测方向和旋转。有一个最小字符数 min_characters_to_try,必须满足才能正常工作。如果引擎无法找到足够的字符或无法识别该字体,则 OSD 将显示错误消息。还有其他导致失败的情况,例如旋转角度不接近 90、180 或 270 度。

此外,请直接传递裁剪后的图像文件,不要使用 OpenCV 或 Pillow 的输出。

osd = pytesseract.image_to_osd(r'D:\image.jpg',config='--psm 0 -c min_characters_to_try=5')

在您的情况下,一个字符是不够的,引擎无法清晰地读取它。

0

一个字符对于OSD功能来说太少了,无法可靠地检测脚本和方向。 有一个参数min_characters_to_try来控制截断。默认值为50。因此,您的图像应至少包含50个字符,以使OSD正常工作。

> $ tesseract --print-parameters | fgrep characters ...
> min_characters_to_try 50  Specify minimum characters to try during OSD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接