Tesseract无法解析图像中的文本

时间:2018-12-16 12:10:25

标签: opencv tesseract python-tesseract

我对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将其正确解析?

1 个答案:

答案 0 :(得分:0)

由于@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))