Tesseract OCR не может обнаружить различный размер шрифта и буквы, которые не выровнены по горизонтали

Я пытаюсь обнаружить эти ценники текста, который всегда явно препроцессор. Хотя он может легко прочитать текст, написанный над ним, он не может определить значения цены. Я использую python bindings pytesseract, хотя он также не считывает команды CLI. Большую часть времени он пытается распознать ту часть, где цена является одним или двумя символами.

Пример 1:

dKC6k.png

tesseract D:\tesseract\tesseract_test_images\test.png output

И результат изображения образца - это.

je Beutel

13

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

Обработанное изображение (обрезанная и сжатая цена):

UNeT2.png

je Beutel

1,89

Как заставить Tesseract OCR работать так, как я предполагал, поскольку я буду перебирать много похожих изображений? Изменить: добавлено больше ценников:
sample2sample3sample4образец5 образец6 образец7

Ответ 1

Проблема в том, что движок Tesseract не был обучен чтению такого рода текстовой топологии.

Вы можете:

  • обучите свою собственную модель, и вам нужно, в частности, предоставить изображения с вариациями топологии (положение персонажей). Вы можете использовать одно и то же изображение и перемещать позиции символов.
  • реорганизовать изображение в кластеры текста и использовать tesseract, в частности, я бы рассмотрел часть цента и переместил ее справа от комы, в этом случае вы можете использовать tesseract из коробки. Немногим релевантными критериями были бы высота кластеров (для разных центов и целых чисел) и положение кластеров (читается слева направо).

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

В вашем случае это будет:

  • "если высота этих букв меньше, то цента",
  • "если высота и вертикальное положение одинаковы, то примерно столько же, либо слева от комы, либо справа от комы".

Дело в том, что трудно достичь этого путем обучения, и в то же время очень просто написать это для человека как алгоритм. Извините, что не дал вам реальной реализации, но мой текст - псевдокод.

TrainingTesseract2

TrainingTesseract4

Совместное неконтролируемое обучение глубоким представлениям и кластерам изображений

Ответ 2

Проблема заключается в том, что изображение, которое вы используете, имеет небольшой размер. Теперь, когда tesseract обрабатывает изображение, он рассматривает " 8 ", " 9 " и " , " как одну букву и поэтому предсказывает это " 3 " или может рассматривать " 8 " и " , " как одну букву и " 9 " как другая буква, и поэтому производит неправильный вывод. Изображение, показанное ниже, объясняет это.

detected contours of original(small) image

Простое решение может увеличить его размер в 2 или 3 раза или даже больше по размеру исходного изображения, а затем перейти к tesseract, чтобы он определял каждую букву индивидуально, как показано ниже. (Здесь я увеличил его размер в 2 раза)

detected contours of resized(larger) image

Bellow - простой скрипт python, который решит вашу цель

import pytesseract
import cv2

img = cv2.imread('dKC6k.png')
img = cv2.resize(img, None, fx=2, fy=2)

data = pytesseract.image_to_string(img)
print(data)

Обнаруженный текст:

je Beutel

89
1.

Теперь вы можете просто извлечь необходимые данные из текста и отформатировать его в соответствии с вашим требованием.

data = data.replace('\n\n', '\n')
data = data.split('\n')

dollars = data[2].strip(',').strip('.')
cents = data[1]

print('{}.{}'.format(dollars, cents))

Желаемый формат:

1.89