OpenCV: сегментирует каждую цифру из данного изображения.Цифры записаны в каждой ячейке матрицы строк.Каждая ячейка ограничена полями - PullRequest
0 голосов
/ 18 апреля 2019

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

Я прошел следующие шаги:

  1. Чтение изображения (в виде изображения в градациях серого) с помощью «imread» метода opencv2.Исходный размер изображения: 19 x 209 (в пикселях).
pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)
Изменение размера изображения на 200% от его первоначального размера с помощью метода "resize" в opencv2.Я использовал интерполяцию INTER_AREA.Размер изображения: 38 х 418 (в пикселях)
h,w = newImg.shape
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
Прикладное обнаружение краев Канни.
v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)
Обрезать контуры и сохранить их в виде изображений в каталоге 'BB'.
im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

num = 0
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    num += 1
    new_img = resizedImg[y:y+h, x:x+w]
    cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)

Полный код в целом:

pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)

h,w = newImg.shape
print(newImg.shape)
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
print(resizedImg.shape)

v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)

im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

num = 0
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    num += 1
    new_img = resizedImg[y:y+h, x:x+w]
    cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)

Полученные изображения размещены здесь: https://imgur.com/a/GStIcdj

Мне пришлось удвоить размер изображения, потому что при обнаружении Canny edge объект получился двойным по краям (однако, он все равно это делает).Я также играл с другими функциями openCV, такими как Thresholding, Gaussian Blur, Dlates, Erode, но все было напрасно.

...