Случайная ошибка Pytesseract при чтении текста - PullRequest
1 голос
/ 20 сентября 2019

Я создаю бота для видеоигры, и мне нужно прочитать информацию, отображаемую на экране.Учитывая, что информация всегда находится в одном и том же месте, у меня нет проблем, чтобы сделать снимок экрана и обрезать изображение до нужного положения.

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 ]

1 голос
/ 20 сентября 2019

Предварительная обработка - важный шаг перед тем, как выбросить изображение в Pytesseract.Как правило, вы хотите, чтобы желаемый текст был черным, а фон - белым.В настоящее время текст переднего плана отображается зеленым цветом, а не белым.Вот простой процесс для исправления формата

  • Преобразование изображения в оттенки серого
  • Порог Оцу для получения двоичного изображения
  • Инвертированное изображение

Исходное изображение

enter image description here

Порог Оцу

enter image description here

Инвертированное изображение

enter image description here

Вывод из Pytesseract

122 Vitalité

Другое изображение

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

200 Vitalité

Перед инвертированием изображения может быть полезно выполнить морфологических операций , чтобы сгладить / отфильтровать текст.Но для ваших изображений текст не обязательно требует дополнительного сглаживания

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()
0 голосов
/ 20 сентября 2019

Как сказано в комментарии, речь идет о вашем тексте и цвете фона.Тессеракт в основном бесполезен, когда светлый текст на темном фоне, вот несколько строк, которые я применяю к любому текстовому изображению, прежде чем передать его тессеракту:

# 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 пикселей, более крупные символы значительно не снижают точность, но на несколько пикселей короче может сделать тессеракт бесполезным!

...