OCR Python: игнорировать подписи в документах

Я пытаюсь сделать OCR отсканированного документа, в котором есть рукописные подписи. См. Изображение ниже.

enter image description here

Мой вопрос прост, есть ли способ все еще извлекать имена людей, использующих OCR, игнорируя подписи? Когда я запускаю Tesseract OCR, он не может получить имена. Я попробовал серость/размытие/порог, используя код ниже, но без везения. Какие-либо предложения?

image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (5, 5), 0)
image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

Ответ 1

Вы можете использовать гауссовый фильтр scikit-image чтобы сначала размыть тонкие линии (с соответствующей sigma), за которым следует бинаризация изображения (например, с некоторой функцией thresholding), затем морфологическими операциями (такими как remove_small_objects или opening с некоторой соответствующей structure) чаще всего удалять сигнатуры, а затем пробовать классифицировать цифры со скользящим окном (при условии, что один уже обучен с некоторыми размытыми символами, как в тестовом изображении). Ниже приведен пример.

from skimage.morphology import binary_opening, square
from skimage.filters import threshold_minimum
from skimage.io import imread
from skimage.color import rgb2gray
from skimage.filters import gaussian

im = gaussian(rgb2gray(imread('lettersig.jpg')), sigma=2)
thresh = threshold_minimum(im)
im = im > thresh
im = im.astype(np.bool)
plt.figure(figsize=(20,20))
im1 = binary_opening(im, square(3))
plt.imshow(im1)
plt.axis('off')
plt.show()    

enter image description here

[EDIT]: использование моделей Deep Learning

Другой вариант заключается в том, чтобы представить проблему как проблему обнаружения объекта, где алфавиты являются объектами. Мы можем использовать глубокое обучение: модели CNN/RNN/Fast RNN (с тензорным потоком /keras) для обнаружения объекта или модель Yolo (см. Эту статью для определения автомобиля с помощью модели yolo).

Ответ 2

Я полагаю, что входные снимки имеют оттенки серого, иначе может отличаться разный цвет чернил.

Проблема в том, что ваш набор тренировок - я думаю, содержит почти только "нормальные" буквы, без нарушения подписи - поэтому, естественно, классификатор не будет работать на письмах с чернилами подписи на них. Один из способов - расширить набор тренировок с помощью букв этого типа. Разумеется, довольно сложно вынимать и наклеивать эти письма один за другим.

Вы можете использовать настоящие буквы с разными сигнатурами на них, но также возможно искусственно генерировать похожие буквы. Вам просто нужны разные буквы с разными фрагментами подписей, перемещаемых над ними. Этот процесс может быть автоматизирован.

Ответ 3

Вы можете попробовать обработать изображение с помощью морфологических операций.

Вы можете попробовать открыть, чтобы удалить тонкие строки подписи. Проблема в том, что он может также удалить знаки препинания.

image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

Возможно, вам придется изменить размер или форму ядра. Просто попробуйте разные наборы.

Ответ 4

Вы можете попробовать другие поставщики OCR для одной и той же задачи. Например, https://cloud.google.com/vision/ попробуйте это. Вы можете загрузить изображение и проверить его бесплатно.

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

Проверьте это. это поможет вам в получении этого текста. это мой собственный ответ, когда я столкнулся с той же проблемой. Преобразование ответа API Google Vision на JSON

enter image description here