OCR Python: игнорировать подписи в документах
Я пытаюсь сделать OCR отсканированного документа, в котором есть рукописные подписи. См. Изображение ниже.
Мой вопрос прост, есть ли способ все еще извлекать имена людей, использующих 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()
[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