opencv - cortando linhas manuscritas (segmentação de linha)

Estou tentando criar um sistema de reconhecimento de manuscrito usando python e opencv. O reconhecimento dos caracteres não é o problema, mas a segmentação. Eu tenho sucesso:

segmentou uma palavra em caracteres únicossegmentou umfrase única em palavras na ordem necessária.

Mas não consegui segmentar linhas diferentes no documento. Tentei classificar os contornos (para evitar a segmentação de linhas e usar apenas a segmentação por palavras), mas não funcionou. Usei o código a seguir para segmentar as palavras contidas em um documento manuscrito, mas ele retorna as palavras fora de ordem (retorna as palavras da maneira ordenada da esquerda para a direita):

import cv2
import numpy as np
#import image
image = cv2.imread('input.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,5), 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)

Observe que eu sou capaz de segmentar todas as palavras aquimas eles aparecem em ordem. Existe alguma maneira de classificar esses contornos em ordem de cima para baixo

OU

segmentar a imagem em linhas separadas para que cada linha possa ser segmentada em palavras usando o código acima?

questionAnswers(1)

yourAnswerToTheQuestion