Выполняйте сегментацию линии (обрезку) последовательно с OpenCV - PullRequest
0 голосов
/ 28 декабря 2018

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

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

Но я применяю этот код ниже, слегка изменив здесь .Основная проблема заключается в том, что он случайно обрезает линию изображения, и я последовательно сохраняю ее как сегмент_№_1,2,3 ....

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

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

Мой код:

import cv2
import numpy as np
#import image
image = cv2.imread('input2.png')
#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.imwrite("segment_no_"+str(i)+".png",roi)
    cv2.rectangle(image,(x,y),( x + w, y + h ),(90,0,255),2)
    cv2.waitKey(0)

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

The final output of the code on IAM database form

segment_no_1.png в качестве первого сегмента строки можно найти по середине или иногда по второму последнему и т. Д.

Итак, какая модификация должна найти сегментированные строки в правильном порядке (последовательно), как в исходном изображении.

Любое улучшение в моем коде также высоко ценится.Заранее спасибо.

1 Ответ

0 голосов
/ 05 января 2019

Я думаю, вы должны следовать этому , где показано, что сортировка контуров с использованием Python и OpenCV.

Ниже приведены основные шаги:

  1. Размытиеизображение и, если необходимо, сначала преобразуйте в оттенки серого.
  2. Примените алгоритм обнаружения края Канни, чтобы найти контур каждого символа.
  3. Передайте обнаруженное изображение края в Адаптивный алгоритм, который работает лучше, учитываясоседние точки.
  4. Выполните расширение, которое лучше работает при сегментации линии.
  5. Выполните сегментацию линии на копии расширенного изображения, которая случайным образом создает сегменты.
  6. Наконец, сортируйте сегментв порядке «сверху вниз».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...