Tesseract 无法解析图像中的文本

Tesseract fails to parse text from image

我对 opencv 和 tesseract 完全陌生。 我花了一整天的时间试图编写代码来解析图像中的游戏持续时间,如下所示:original image(游戏持续时间在左上角)

我找到了有时能够识别持续时间的代码(大约占所有案例的 40%)。这是:

try:
    from PIL import Image
except ImportError:
    import Image
import os
import cv2
import pytesseract
import re
import json

def non_digit_split(s):
    return filter(None, re.split(r'(\d+)', s))

def time_to_sec(min, sec):
    return (int(min) * 60 + int(sec)).__str__()

def process_img(image_url):
    img = cv2.resize(cv2.imread('./images/' + image_url), None, fx=5, fy=5, interpolation=cv2.INTER_CUBIC)
    str = pytesseract.image_to_string(img)

    if "WIN " in str:
        time = list(non_digit_split(str.split("WIN ",1)[1][0:6].strip()))
        str = time_to_sec(time[0], time[2])
    else:
        str = 'Not recognized'
    return str

res = {}
img_list = os.listdir('./images')
print(img_list)

for i in img_list:
    res[i] = process_img(i)

with open('output.txt', 'w') as file:
     file.write(json.dumps(res))

甚至不要问我是如何调整图像大小的,但这有点帮助。 我也试过像这样先裁剪图像: cropped image 但 tesseract 在这里找不到任何文本。

我确信我要解决的问题很简单。你能给我指出正确的方向吗?我应该如何预处理它以便 tesseract 能够正确解析它?

感谢@DmitriiZ 的评论,我设法生成了一段有效的代码。 我做了一个预处理器输出类似的东西: Preprocessed image Tesseract 处理得很好。

完整代码如下:

try:
    from PIL import Image
except ImportError:
    import Image
import os
import pytesseract
import json

def is_dark(image):
    pixels = image.getdata()
    black_thresh = 100
    nblack = 0
    for pixel in pixels:
        if (sum(pixel) / 3) < black_thresh:
            nblack += 1
    n = len(pixels)

    if (nblack / float(n)) > 0.5:
        return True
    else:
        return False

def preprocess(img):
    basewidth = 500
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))

    #Enlarging image
    img = img.resize((basewidth,hsize), Image.ANTIALIAS)

    #Converting image to black and white
    img = img.convert("1", dither=Image.NONE)
    return img

def process_img(image_url):
    img = Image.open('./images/' + image_url)

    #Area we need to crop can be found in one of two different areas,
    #depending on which team won. You can replace that block and is_dark()
    #function by just img.crop().
    top_area = (287, 15, 332, 32)
    crop = img.crop(top_area)
    if is_dark(crop):
        bot_area = (287, 373, 332, 390)
        crop = img.crop(bot_area)

    img = preprocess(crop)

    str = pytesseract.image_to_string(img)

    return str

res = {}
img_list = os.listdir('./images')
print(img_list)

for i in img_list:
    res[i] = process_img(i)

with open('output.txt', 'w') as file:
     file.write(json.dumps(res))