Tesseract OCR не может обнаружить различный размер шрифта и буквы, которые не выровнены по горизонтали
Я пытаюсь обнаружить эти ценники текста, который всегда явно препроцессор. Хотя он может легко прочитать текст, написанный над ним, он не может определить значения цены. Я использую python bindings pytesseract, хотя он также не считывает команды CLI. Большую часть времени он пытается распознать ту часть, где цена является одним или двумя символами.
Пример 1:
tesseract D:\tesseract\tesseract_test_images\test.png output
И результат изображения образца - это.
je Beutel
13
Однако, если я собираю и растягиваю цену, чтобы выглядеть так, как будто они разделены и имеют один и тот же размер шрифта, вывод будет прекрасным.
Обработанное изображение (обрезанная и сжатая цена):
je Beutel
1,89
Как заставить Tesseract OCR работать так, как я предполагал, поскольку я буду перебирать много похожих изображений? Изменить: добавлено больше ценников:
образец5 образец6 образец7
Ответы
Ответ 1
Проблема в том, что движок Tesseract не был обучен чтению такого рода текстовой топологии.
Вы можете:
- обучите свою собственную модель, и вам нужно, в частности, предоставить изображения с вариациями топологии (положение персонажей). Вы можете использовать одно и то же изображение и перемещать позиции символов.
- реорганизовать изображение в кластеры текста и использовать tesseract, в частности, я бы рассмотрел часть цента и переместил ее справа от комы, в этом случае вы можете использовать tesseract из коробки. Немногим релевантными критериями были бы высота кластеров (для разных центов и целых чисел) и положение кластеров (читается слева направо).
В целом алгоритмы компьютерного зрения (в том числе CNN) предоставляют вам инструмент для более высокого представления изображения (функции или дескрипторы), но они не могут создать логику или алгоритм для обработки промежуточных результатов определенным образом.
В вашем случае это будет:
- "если высота этих букв меньше, то цента",
- "если высота и вертикальное положение одинаковы, то примерно столько же, либо слева от комы, либо справа от комы".
Дело в том, что трудно достичь этого путем обучения, и в то же время очень просто написать это для человека как алгоритм. Извините, что не дал вам реальной реализации, но мой текст - псевдокод.
TrainingTesseract2
TrainingTesseract4
Совместное неконтролируемое обучение глубоким представлениям и кластерам изображений
Ответ 2
Проблема заключается в том, что изображение, которое вы используете, имеет небольшой размер. Теперь, когда tesseract обрабатывает изображение, он рассматривает " 8 ", " 9 " и " , " как одну букву и поэтому предсказывает это " 3 " или может рассматривать " 8 " и " , " как одну букву и " 9 " как другая буква, и поэтому производит неправильный вывод. Изображение, показанное ниже, объясняет это.
Простое решение может увеличить его размер в 2 или 3 раза или даже больше по размеру исходного изображения, а затем перейти к tesseract, чтобы он определял каждую букву индивидуально, как показано ниже. (Здесь я увеличил его размер в 2 раза)
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