Opencv HoughLinesP将非常相似的线条组合为一条

Opencv HoughLinesP将非常相似的线条组合为一条,opencv,opencv3.0,houghlinesp,Opencv,Opencv3.0,Houghlinesp,我有一张简单的图片,我想提取线条的端点。但是,也有其他行重叠,因此,我的行中有“间隙”。 我试图使用HoughLinesP来提取这十条线的参数化,虽然视觉效果是合理的,但它仍然给了我43条单独的线。 我尝试过平滑线条,线条的骨架表示,在每一条线条之后重新绘制线条,我现在正在处理countours。我已经调整了我的参数(线路长度、最大间距、阈值等),但我无法将其减少到十条线路。在我当前的代码中,我将第一个图像从自身中减去,以创建一个新的黑色空间来绘制我的Houghline,可能不是最有效的,但

我有一张简单的图片,我想提取线条的端点。但是,也有其他行重叠,因此,我的行中有“间隙”。

我试图使用HoughLinesP来提取这十条线的参数化,虽然视觉效果是合理的,但它仍然给了我43条单独的线。

我尝试过平滑线条,线条的骨架表示,在每一条线条之后重新绘制线条,我现在正在处理countours。我已经调整了我的参数(线路长度、最大间距、阈值等),但我无法将其减少到十条线路。在我当前的代码中,我将第一个图像从自身中减去,以创建一个新的黑色空间来绘制我的Houghline,可能不是最有效的,但它是有效的。这是我的密码:

    import numpy as np
    import cv2

    img = cv2.imread('masked.png')

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray,50,150,apertureSize = 3)

    minLineLength = 100

    img2 = cv2.subtract(img, img)

    lines = cv2.HoughLinesP(gray,1,np.pi/180,10,minLineLength,maxLineGap=100)

    print(len(lines))

    for n in range(len(lines)):
        for x1,y1,x2,y2 in lines[n]:
            cv2.line(img2,(x1,y1),(x2,y2),(0,255,0),1,4)

    cv2.imshow('result.png', img2)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

有没有另一种方法可以让我填补这些空白,得出十条直线方程?我现在正在使用Python、OpenCV和Numpy。

是的,绝对正确!您可以简单地使用斜率截距形式
y=mx+b
来分隔线。所有的线都应该具有相同的斜率
m
,但它们各自具有不同的截距
b
。您有两个端点,因此可以计算
m
,然后为每一行插入一个必须获得
b
的端点。然后,如果这些行具有相似的
b
值,则您知道它们是相同的整体行,因此您可以将它们平均在一起。更好的是,因为你有40条具有相同斜率的直线,你可以将它们的所有斜率平均起来,然后找到单独的截距。好主意!今晚我会尽量不要太重,但这些是笛卡尔形式的,不是极坐标形式的
HoughLinesP
只给出笛卡尔坐标系中由两个端点定义的直线。我接受这一点。这是一组两点,虽然我认为它使用ρ和θ来得到它们。。。但这与我对清晰性的需求无关,
rho,theta
形式不是极性的,而是Hough变换的Hesse范式。在极坐标中,
rho,θ定义一个点;在黑森范式中,
rho,theta
表示一条线。在任何情况下,
HoughLines
以黑森标准形式返回行,其中
HoughLinesP
以笛卡尔端点对返回行。您确实说过您尝试过骨骼化和类似的操作,但是在运行变换之前,您是否应用过形态学操作来简单地连接线?