gpt4 book ai didi

opencv - 从 Canny 边缘提取单线轮廓

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:02 25 4
gpt4 key购买 nike

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

使用 Canny 我能够生成仅包含图像边缘的二值图像。然后,我尝试使用 findContours 来提取轮廓。但是,结果并不理想。

对于每条边,我经常得到 2 条线,就像它被认为是一个非常薄的区域一样。我想简化我的轮廓,这样我就可以把它们画成单线。或者用直接产​​生正确结果的不同函数提取它们会更好。

我查看了 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灰度
  • EdgesCanny
  • 提取
  • Contours :10 倍缩放,您可以在其中看到 findContours
  • 产生的 错误结果

任何建议将不胜感激。

最佳答案

如果我没理解错的话,您的问题与在参数(霍夫变换)意义上寻找直线无关。

而是 findContours 方法为单条线返回多个轮廓的问题。

这是因为 Canny 是一个边缘检测器 - 这意味着它的滤波器与发生在一条线的两侧上的图像强度梯度相协调。

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

这是一个相当普遍的话题 - 这是之前提出的一个解决方案的帖子:

OpenCV converting Canny edges to contours

关于opencv - 从 Canny 边缘提取单线轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18074680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com