从Canny边缘提取单线轮廓

时间:2013-08-06 08:00:07

标签: opencv computer-vision contour edge-detection feature-extraction

我想提取图像的轮廓,表示为一系列点坐标。

使用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)

比例因子用于突出轮廓的双线。 以下是图片的链接:

  • Lena greyscale
  • Edges使用Canny
  • 提取
  • Contours:10倍缩放,您可以在其中看到由findContours
  • 生成的错误的结果

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:7)

如果我理解你的话,你的问题与在参数(Hough变换)意义上寻找线条无关。

相反,使用findContours方法返回单行的多个轮廓是一个问题。

这是因为Canny是 edge 检测器 - 这意味着它是与图像强度梯度相匹配的滤镜,它出现在一行的两个侧。

所以你的问题更类似于:“如何将低级别边缘特征转换为单行?”,或者可能:“我如何导航轮廓层次结构以检测单行?"

这是一个相当常见的主题 - 以下是一篇提出一个解决方案的帖子:

OpenCV converting Canny edges to contours