Сегментирование рукописного текста в строки

Я пытаюсь разбить рукописный текст из набора данных форм NIST на отдельные строки. Вот ссылка на набор данных: https://www.nist.gov/srd/nist-special-database-19

Пример изображения Пример формы

Код, который я использую, основан на аналогичном вопросе о stackru, но он не совсем работает из-за касания некоторых символов. Вот код:

import cv2
import numpy as np
#import image
image = cv2.imread('form1.jpg')
#cv2.imshow('orig',image)
#cv2.waitKey(0)

#grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
cv2.waitKey(0)

#binary
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow('second',thresh)
cv2.waitKey(0)

#dilation
kernel = np.ones((5,100), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilated',img_dilation)
cv2.waitKey(0)

#find contours
im2,ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, 
cv2.CHAIN_APPROX_SIMPLE)

#sort contours
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

for i, ctr in enumerate(sorted_ctrs):
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)

    # Getting ROI
    roi = image[y:y+h, x:x+w]

    # show ROI
   cv2.imshow('segment no:'+str(i),roi)
   cv2.rectangle(image,(x,y),( x + w, y + h ),(90,0,255),2)
   cv2.waitKey(0)

cv2.imshow('marked areas',image)
cv2.waitKey(0)        

Как получить правильное разделение строк, даже если некоторые символы перекрываются?

0 ответов

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

Из приведенного кода видно, что вы используете Contour Detection. Возможно, вы захотите поиграть с ограничением соотношения сторон на обнаруженных контурах, чтобы пропустить подключенные компоненты. Здесь вы можете найти идеи для вашего проекта, а также описание того, как сделать ограничение соотношения сторон.

Если вы все еще хотите сохранить их, вам потребуется выполнить постобработку. Либо это будет включать чередование морфологии для этих элементов, либо применение какого-либо типа машинного / глубокого обучения.

Это самая сложная часть, и она может иметь много разных решений. Для своего проекта я использовал Convolutional Neural Network с Keras, чтобы обучить модель классифицировать буквы и вывести выбросы в отдельный класс. Как вы уже догадались, я добавил еще пару классов с обучающими данными (понадобятся тысячи обучающих примеров) к существующему набору данных из MNIST-подобных букв.

Удачи!

Другие вопросы по тегам