Я пытаюсь выполнить распознавание транспортных средств, таких как поезда или грузовики, чтобы идентифицировать написанные на них числа и символы. (Обратите внимание, что это не 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]