Как улучшить распознавание текста, написанного на транспортных средствах?

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

Я взял это изображение. Идея состоит в том, чтобы иметь возможность извлечь текст - BN SF 721 734, написанный на нем.

введите здесь описание изображения

Для предварительной обработки я сначала преобразовал это изображение в оттенки серого, а затем преобразовал его в бинаризованное изображение, которое выглядит примерно так:

введите здесь описание изображения

Я написал код в tesseract.

myimg = "image.png"
image = Image.open(myimg)
with PyTessBaseAPI() as api:
    api.SetImage(image)
    api.Recognize()
    words = api.GetUTF8Text()
    print words
    print api.AllWordConfidences()

Этот код дал мне пустой вывод со значением достоверности 95, что означает, что tesseract был на 95% уверен, что на этом изображении нет текста.

Затем я использовал API-интерфейс setrectangle в Tesseract, чтобы ограничить распознавание текста в определенном окне внутри изображения, вместо того, чтобы пытаться выполнять распознавание всего изображения.

myimg = "image.png"
image = Image.open(myimg)
with PyTessBaseAPI() as api:
    api.SetImage(image)
    api.SetRectangle(665,445,75,40)
    api.Recognize()
    words = api.GetUTF8Text()
    print words
    print api.AllWordConfidences()
    print "----"

Координаты 665, 445, 75 и 40 соответствуют прямоугольнику, который содержит на изображении текст BNSF 721 734. 665 — верх, 445 — лево, 75 — ширина и 40 — высота.

Результат, который я получил, был следующим:

an s
m,m

Мой вопрос: как улучшить результаты? Я поиграл со значениями в функции setrectangle, и результаты немного отличались, но все они были одинаково плохи.

Есть ли способ улучшить это?

Если вам интересно, как я преобразовал изображения в бинарные изображения, я использовал OpenCV

img = cv2.imread(image)
grayscale_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
(thresh, im_bw) = cv2.threshold(grayscale_img, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
thresh = 127
binarized_img = cv2.threshold(grayscale_img, thresh, 255, cv2.THRESH_BINARY)[1]

person Piyush    schedule 11.02.2017    source источник
comment
Попробуйте извлечь регионы MSER с помощью OpenCV. Скорми это Тессеракту   -  person Jeru Luke    schedule 12.02.2017
comment
@JeruLuke: попробую этот вариант. Мне нужно прочитать о регионах MSER, потому что я не уверен, как они работают в настоящее время. Мой вопрос: поможет ли это повысить точность распознавания текста или просто поможет мне автоматически выделить прямоугольник вокруг текста? Спасибо   -  person Piyush    schedule 13.02.2017
comment
Попробуйте использовать преобразование ширины обводки, чтобы сначала определить расположение текста на изображении. Он специально разработан для поиска текста. Как правило, избегайте бинаризации слишком рано.   -  person Rethunk    schedule 13.02.2017


Ответы (1)


Я предлагаю найти контуры в вашем обрезанном прямоугольнике и установить некоторые параметры, чтобы они соответствовали контурам ваших персонажей. Например: контуры с площадью больше или меньше некоторых порогов. Затем нарисуйте один за другим контур на пустом растровом изображении и выполните распознавание символов.

Я знаю, что это кажется большой работой, но это дает вам лучшие и более надежные результаты. Удачи!

person Monika Bozhinova    schedule 14.02.2017