根据行分割图像

时间:2018-10-21 14:39:35

标签: python opencv

我正拼命试图在openCV中找到使用HoughLines或任何其他方法检测线的方法,我从文档图像开始,并使用结构元素和腐蚀来获得带线的二进制图像。

我设法获得了以下文件,但似乎无法获得遵循我看来(明显是问题所在)的明显线条的HoughLine。关于如何前进的任何想法,还是应该使用其他方法从头开始?

最终目的是将文档的行提取为单独的图像,然后尝试一些用于手写文本识别的ML算法。

Original file

File after erode and structural elem

1 个答案:

答案 0 :(得分:3)

我认为Hough Lines应该适合您的情况。正在运行

lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)

其中img_thr是您的二进制图像会产生很好的结果:

Extracted Lines

这些线可以按左端的y坐标排序(例如),然后两条连续的线将形成一个矩形,可以使用cv2.perspectiveTransform提取该矩形。

有一些问题需要解决,以使此过程更可靠:

  • 算法可以为图像中的每一行返回多行,因此需要对它们进行重复数据删除。
  • 可能存在一些误报,因此您需要一些条件才能删除它们。我认为查看直线的斜率和连续直线之间的距离应该可以完成这项工作。
  • thresholdcv2.HoughLines参数的效果在很大程度上取决于图像分辨率,因此在执行此过程之前,应将图像调整为一定的大小。

完整代码:

img_orig = url_to_image('https://i.stack.imgur.com/PXDKG.png') # orignal image
img_thr = url_to_image('https://i.stack.imgur.com/jZChK.png')  # binary image
h, w, _ = img_thr.shape
img_thr = img_thr[:,:,0]

lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)
img_copy = img_orig.copy()
points = []
for rho,theta in lines[:, 0]:
    a, b = np.cos(theta), np.sin(theta)
    x0, y0 = a*rho, b*rho
    x1, x2 = 0, w
    y1 = y0 + a*((0-x0) / -b)
    y2 = y0 + a*((w-x0) / -b)
    cv2.line(img_copy,(int(x1),int(y1)),(int(x2),int(y2)),(255,0,0),4)
    points.append([[x1, y1], [x2, y2]])
points = np.array(points)