Pytesseract阅读文本时的随机错误

时间:2019-09-20 06:33:22

标签: python image opencv ocr python-tesseract

我正在为视频游戏创建机器人,我必须阅读屏幕上显示的一些信息。鉴于信息始终在同一位置,因此我可以截取屏幕截图并将图片裁剪到正确的位置。

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

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

def readScreenPart(x,y,w,h):
    monitor = {"top": y, "left": x, "width": w, "height": h}
    output = "monitor.png"
    with mss.mss() as sct:
        sct_img = sct.grab(monitor)        
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)

    img = cv2.imread("monitor.png")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("result.png", img)
    config = ("-l fra --oem 1 --psm 6")

    return pytesseract.image_to_string(img,config=config)

示例:此图片生成错误,它返回字符串“ IRPMV / LEIILK”

enter image description here

另一张图片

enter image description here

现在我不知道问题的出处,因为它不仅是一个错误的字符,而且是一个完全随机的结果。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

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

原始图片

enter image description here

大津的门槛

enter image description here

反转图像

enter image description here

Pytesseract的输出

  

122活力

其他图片

enter image description here enter image description here enter image description here

  

200点生命力

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

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()

答案 1 :(得分:0)

正如评论所说,这与您的文字和背景颜色有关。 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

现在,无论原始颜色是哪种颜色,您都可以肯定在白色背景上有黑色文字,如果字符高度为35像素,Tesseract也是(最奇怪的)最有效的方法,较大的字符不会显着降低精度,但短一些像素会使tesseract失去作用!