2017-02-11 16 views
3

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

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

enter image description here

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

enter image description here

Я написал код в тессеракте.

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, что означает, что тессеракт был 95% уверен, что текст не существует в этом образе.

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

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] 
+0

Попробуйте извлечь области MSER с помощью OpenCV. Подайте это Tesseract –

+0

@JeruLuke: Попробуй этот вариант. Мне нужно узнать о регионах MSER, потому что я не уверен, как они работают в настоящее время. Мой вопрос заключается в том, поможет ли это повысить точность OCR или просто поможет мне в автоматическом извлечении прямоугольника вокруг текста? Спасибо – Piyush

+0

Попробуйте использовать Transform Width Transform, чтобы сначала определить местоположение текста на изображении. Он специально разработан для поиска текста. Как правило, избегайте бинаризации слишком рано. – Rethunk

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^