从Canny边缘提取单行轮廓

12

我想提取一张图像的轮廓,以点坐标的形式表示。

使用 Canny 函数,我能够产生一个仅包含图像边缘的二进制图像。然后,我尝试使用 findContours 函数来提取轮廓。但是结果不太好。

对于每个边缘,我经常得到两条线,就好像它被认为是非常细的区域。

我想简化我的轮廓,使它们可以绘制成单独的线段。或者使用另一个函数来提取它们,直接产生正确的结果可能更好。

我已经查看了 OpenCV 的文档,但没有找到有用的内容,但我想我不是第一个遇到这样问题的人。有没有我可以使用的函数或方法?

以下是我目前编写的 Python 代码:

def main():
    img = cv2.imread("lena-mono.png", 0)

    if img is None:
        raise Exception("Error while loading the image")

    canny_img = cv2.Canny(img, 80, 150)

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

    scale = 10
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)

    for cnt in contours:
        color = np.random.randint(0, 255, (3)).tolist()
        cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)

    cv2.imwrite("canny.png", canny_img)
    cv2.imwrite("contours.png", contours_img)

比例因子用于强调轮廓的双线。

以下是图像链接:

非常感谢任何建议。


1
你应该使用HoughLines。http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlines - Khashayar
模糊图像以减少噪声。 - baci
我认为这不是图像中噪声的问题。如果您查看使用Canny提取的边缘,它们是正常的。使用HoughLines,我无法处理图像中的曲线线条,对吗? - Muffo
当然,你可以尝试调整一些参数来达到你想要的效果。对于曲线,你可能会得到多条直线!这些直线基本上是起点和终点!我们正在处理道路上的车道检测,这也是我们使用的方法。 - Khashayar
1个回答

8
如果我理解正确,你的问题与在参数化(霍夫变换)意义下查找线段无关。相反,它是一个关于findContours方法返回单个线条的多个轮廓的问题。
这是因为Canny是一种边缘检测器——这意味着它是针对出现在线条两侧的图像强度梯度的滤波器。
所以你的问题更类似于:“如何将低级边缘特征转换为单行?”,或者:“如何导航轮廓层次结构以检测单行?”
这是一个非常常见的主题——以下是之前的帖子提出的一个解决方案: OpenCV converting Canny edges to contours

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接