Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取文本时出现PyteSeract随机错误_Python_Image_Opencv_Ocr_Python Tesseract - Fatal编程技术网

Python 读取文本时出现PyteSeract随机错误

Python 读取文本时出现PyteSeract随机错误,python,image,opencv,ocr,python-tesseract,Python,Image,Opencv,Ocr,Python Tesseract,我正在为视频游戏创建一个机器人,我必须阅读屏幕上显示的一些信息。考虑到信息总是在同一位置,我不需要截图并将图片裁剪到正确的位置 90%的情况下,识别是完美的,但有时它会返回一些看起来完全随机的东西(参见下面的示例) 我尝试将图片转换为黑白,但没有成功,并且尝试更改pytesseract配置(配置=(“-l fra--oem 1--psm 6”) 示例:此图片生成一个bug,它返回字符串“IRPMV/leilk” 另一个图像 现在我不知道问题从何而来,因为这不仅仅是一个错误的字符,而是一个完全

我正在为视频游戏创建一个机器人,我必须阅读屏幕上显示的一些信息。考虑到信息总是在同一位置,我不需要截图并将图片裁剪到正确的位置

90%的情况下,识别是完美的,但有时它会返回一些看起来完全随机的东西(参见下面的示例)

我尝试将图片转换为黑白,但没有成功,并且尝试更改pytesseract配置
(配置=(“-l fra--oem 1--psm 6”)

示例:此图片生成一个bug,它返回字符串“IRPMV/leilk”

另一个图像

现在我不知道问题从何而来,因为这不仅仅是一个错误的字符,而是一个完全随机的结果


感谢您的帮助

正如评论所说,这是关于您的文本和背景颜色的。Tesseract在深色背景上的浅色文本基本上是无用的,以下是我在将文本图像交给Tesseract之前应用于任何文本图像的几行代码:

# convert color image to grayscale
grayscale_image = cv2.cvtColor(your_image, cv2.COLOR_BGR2GRAY)

# Otsu Tresholding method find perfect treshold, return an image with only black and white pixels
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

# we just don't know if the text is in black and background in white or vice-versa
# so we count how many black pixels and white pixels there are
count_white = numpy.sum(binary > 0)
count_black = numpy.sum(binary == 0)

# if there are more black pixels than whites, then it's the background that is black so we invert the image's color
if count_black > count_white:
    binary_image = 255 - binary_image

black_text_white_background_image = binary_image

现在,无论原始图像是哪种颜色,您都可以确保白色背景上有黑色文本,而且Tesseract(奇怪的是)是最有效的。如果字符高度为35像素,较大的字符不会显著降低精度,但短几个像素会使Tesseract变得无用

预处理是将图像放入Pytesseract之前的一个重要步骤。通常,您希望所需的文本为黑色,背景为白色。当前,前景文本为绿色而不是白色。下面是一个修复格式的简单过程

  • 将图像转换为灰度
  • 获得二值图像的大津阈值
  • 反转图像

原始图像

大津阈值

反转图像

Pytesseract的输出

122维塔利泰酒店

其他图像

200维塔利

在反转图像之前,最好执行平滑/过滤文本。但是对于图像,文本不需要额外的平滑

import cv2
import pytesseract

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

image = cv2.imread('3.png',0)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
result = 255 - thresh

data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()

另一个例子是,这个函数返回“plowwleilÿ3”(
Pytesseract
使用程序
tesseract
,创建该程序是为了识别白纸上带有黑色文本的扫描文档。在
tesseract
页面上,您甚至可以找到如何在白色背景上创建更好的黑色文本的信息,以便使用
tesseract
获得更好的结果。您的代码在深灰色背景上创建浅灰色文本,因此可能不足以正确识别文本。。在反转图像中,您可以阅读:tesseract 3.05版(及更高版本)处理反转图像(暗背景和亮文本)时没有问题,而对于4.x版,在亮背景上使用暗文本。您可以使用
img=255-img
反转图像。我使用您的示例运行代码,得到正确的结果。甚至我也不需要转换成灰度。PyTesseract 0.2.7/Tesseract 4.0.0-beta.1/Python 3.7.4/Linux-Mint 19.2。工作正常,感谢您的帮助:)
import cv2
import pytesseract

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

image = cv2.imread('3.png',0)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
result = 255 - thresh

data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()