Распознавание цифр в python (OpenCV и pytesseract) - PullRequest
0 голосов
/ 20 сентября 2019

В настоящее время я пытаюсь определить цифры по маленьким скриншотам.Тем не менее, я нашел точность довольно плохой.Я использовал OpenCV, изображение захватывается в RGB и преобразуется в оттенки серого, затем пороговое значение было выполнено с использованием глобального значения (я обнаружил, что адаптивный не очень хорошо работает).

Вот пример серого цвета-масштаб одного из чисел, сопровождаемый примером удержания порога изображения (числа могут варьироваться от 1 до 99).Обратите внимание, что первоначальный снимок экрана изображения достаточно мал и поэтому увеличен.

enter image description here

enter image description here

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

def getNumber(image):
    image = cv2.resize(image, (0, 0), fx=3, fy=3)
    img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    thresh, image_bin = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)

    image_final = PIL.Image.fromarray(image_bin)

    txt = pytesseract.image_to_string(
        image_final, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')
    return txt

1 Ответ

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

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

Это окончательное изображение final_image и pytesseractудалось прочитать "46"

   def getNumber(image):

    img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # Otsu Tresholding automatically find best threshold value
    _, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

    # invert the image if the text is white and background is black
    count_white = numpy.sum(binary_image > 0)
    count_black = numpy.sum(binary_image == 0)
    if count_black > count_white:
        binary_image = 255 - binary_image

    # padding
    final_image = cv2.copyMakeBorder(image, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=(255, 255, 255))

    txt = pytesseract.image_to_string(
        final_image, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')

    return txt

РЕДАКТИРОВАТЬ: обратите внимание, что вам не нужна эта строка:

image_final = PIL.Image.fromarray(image_bin)

, так как вы можете передать pytesseractr изображение в формате массива numpy (который cv2использовать), а точность Тессеракта падает только для символов до 35 пикселей (а также больше, высота 35px на самом деле является оптимальной высотой), поэтому я не изменил ее размер.

...