将手写文字分割成几行

时间:2018-10-21 22:28:16

标签: python opencv line-segment

我正在尝试将NIST表单数据集中的手写文本拆分为单独的行。这是数据集的链接: https://www.nist.gov/srd/nist-special-database-19

示例图片 Example Form

我正在使用的代码基于一个关于stackoverflow的类似问题,但是由于某些字符接触,它无法正常工作。这是代码:

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)        

即使某些字符重叠,我如何才能正确地分割行呢?

1 个答案:

答案 0 :(得分:0)

我正在研究类似的问题,并且样本质量很好。

从给出的代码中,我可以看到您正在使用轮廓检测​​。您可能希望对检测到的轮廓使用宽高比限制,以便省略连接的组件。 Here您可以找到有关您的项目的见解以及有关如何进行长宽比限制的说明。

如果您仍要保留它们,则需要执行后处理。要么涉及这些元素的形态变化,要么涉及某种机器/深度学习的应用。

那是最复杂的部分,可能有许多不同的解决方案。在我的项目中,我将卷积神经网络与Keras配合使用,以训练模型对字母进行分类,并将离群值放在单独的类中。正如您可能已经猜到的那样,我在现有的类似MNIST的字母数据集中添加了更多类的训练数据(将需要成千上万个训练示例)。

祝你好运!