Python OCR: игнорировать подписи в документах - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь сделать 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]

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Вы можете использовать фильтр Гаусса 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

[РЕДАКТИРОВАТЬ]: Используйте модели глубокого обучения

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

0 голосов
/ 28 августа 2018

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

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

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

enter image description here

0 голосов
/ 28 августа 2018

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

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

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)

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

0 голосов
/ 27 августа 2018

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

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

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

...