Тессеракт - как работать с разделителями символов - PullRequest
0 голосов
/ 03 ноября 2018

Как правильно распознать текст внутри символьных разделителей с помощью тессеракта (предварительной обработки или с помощью специальной конфигурации тессеракта), особенно типа расчески (3-е изображение), как на этих трех изображениях ниже:

https://i.stack.imgur.com/Jb5Qd.png
https://i.stack.imgur.com/GhzCa.png
https://i.stack.imgur.com/rI4c1.png

1) Конкретное изображение, на котором я пытался выполнить OCR, показано ниже. enter image description here Изображение четкое, с высоким разрешением и без шумов. Если я передам это изображение прямо в тессеракт (попробовал почти все режимы сегмента страницы), получится следующее:

1
11, 9;9j1 | 0,7 4142 |

Как видно, цифры правильно распознаются и отображаются как подмножество извлеченного текста. Однако разделители также распознаются как «1», «,», «7», «4», «|». Ожидаемый результат - 1992 07 12.

2) Я новичок в распознавании изображений. Предварительная обработка изображений является важным шагом перед распознаванием текста. Я попытался выполнить заливку слева, снизу и справа, чтобы удалить разделители символов. Концепция взята отсюда: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/ Хотя это решение работает для этого конкретного изображения, оно определенно не является общим решением. Поскольку эти символьные разделители распространены во многих формах, должен быть хороший способ извлечения текста.

3) Я попробовал поискать в Google и не смог найти ничего твердого (много шума по несвязанным темам) на первых 10 страницах результатов. Мой поисковый запрос - «разделитель символов тессеракта». Плохие результаты могут быть связаны с плохим выбором поискового запроса, который отличается от того, что использует сообщество CV.

4) Я попробовал abbyy finereader, и текст распознается без проблем. Однако это приложение платное и закрытое.

1 Ответ

0 голосов
/ 04 ноября 2018

Есть много способов, как решить вашу проблему. Например, если линии, которые образуют ваши ячейки, связаны - вы можете фильтровать большие связанные компоненты, используя opencv.

gray = cv2.imread('path_to_your/image.png', 0)
_, blackAndWhite = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, None, None, None, 8, cv2.CV_32S)
sizes = stats[1:, -1]
img2 = np.zeros((labels.shape), np.uint8)

for i in range(0, nlabels - 1):
    if sizes[i] <= 5000:   #CHANGE THIS VALUE TO CHANGE THRESHOLD.
        img2[labels == i + 1] = 255

res = cv2.bitwise_not(img2)

cv2.imshow('res.png', res)
cv2.waitKey(0)

enter image description here

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

...