【问题标题】:Splitting image according to lines根据线条分割图像
【发布时间】:2018-10-21 14:39:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    我认为霍夫线应该适用于您的情况。跑步

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

    img_thr 是您的二进制图像,结果非常好:

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

    有几个问题需要解决以使这个过程更加健壮:

    • 算法可以为图像中的每一行返回多行,因此需要对其进行去重。
    • 可能存在一些误报行,因此您需要一些条件才能将其删除。我认为查看直线的斜率和连续直线之间的距离应该可以解决问题。
    • cv2.HoughLines 中的threshold 参数的效果很大程度上取决于图像分辨率,因此您应该在运行此过程之前将图像大小调整为某个恒定大小。

    完整代码:

    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)
    

    【讨论】:

    • 多么简单,我不知道我以前的参数从哪里来,但这是完美的谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2011-08-29
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多