gpt4 book ai didi

python - 是否可以以不切断角的方式在 python 中使用 OpenCV 轮廓?

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

我在 python 中使用 OpenCV 轮廓函数。例如在这样的图像上:

enter image description here

contours, _ = cv2.findContours(img_expanded_padded, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

enter image description here它工作得很好,除了它切断了轮廓内侧的角,如上所示。是否有任何选项可以留下这个角落?

沿着等高线移动并手动填充它们的计算成本太高。以上只是一个例子。这将在 5400x5400 或更大的图像上执行多次...

我可以用下面的代码找到边缘,结果填充了角,但我需要再次将它们提取为轮廓。

# FIND ALL HORIZONTAL AND VERTICAL EDGES AND COMBINE THEM
edges_expanded_x = np.absolute(cv2.Sobel(img_expanded_padded,cv2.CV_64F, 1, 0, ksize=3))
edges_expanded_y = np.absolute(cv2.Sobel(img_expanded_padded,cv2.CV_64F, 0, 1, ksize=3))
edges_expanded = np.logical_or(edges_expanded_x, edges_expanded_y)

# GET RID OF DOUBLE EDGE THAT RESULTS FROM SOBEL FILTER
edges_expanded = np.multiply(img_expanded_padded,edges_expanded)

我可以使用任何 OpenCV 设置或函数来完成此操作吗?

编辑:我应该澄清一下,我的目标是拥有单个像素的连续轮廓。我需要轮廓,而不是包括轮廓在内的整个图像的数组。

编辑:上面的图像放大到我的测试图像中。实际像素如下图中的红色网格所示。

enter image description here

enter image description here

最佳答案

无需使用cv2.Sobel,您只需在黑色背景上使用cv2.drawContours 绘制等高线即可。黑色背景可以借助 np.zeros 绘制。

img = cv2.imread('contouring.png',0)
contours, _ = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
bgr = np.zeros((img.shape[0], img.shape[1]), dtype= 'uint8')
cv2.drawContours(bgr, contours, -1, (255,255,255), 1)

thin egdes

如果您希望轮廓线较粗,则可以使用 cv2.dilate。然后为了防止切角 cv2.bitwise_and 可以与 cv2.bitwise_not 一起使用,如下所示

bgr = cv2.dilate(bgr, np.ones((31, 31), np.uint8), iterations=1)
bgr = cv2.bitwise_and(bgr, cv2.bitwise_not(img))

这给出了 15 像素厚的轮廓。 thick edges

编辑- 细轮廓的第一张图片仍然偷工减料。为了获得没有角的单像素轮廓,我们可以使用 3*3 的内核大小。

img = cv2.imread('contouring.png',0)
contours, _ = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
bgr = np.zeros((img.shape[0], img.shape[1]), dtype= 'uint8')
cv2.drawContours(bgr, contours, -1, (255,255,255), 1)
bgr = cv2.dilate(bgr, np.ones((3, 3), np.uint8), iterations=1)
bgr = cv2.bitwise_and(bgr, cv2.bitwise_not(img))

这给了我们 RESULT

我已经通过在 bgr 和 img 之间使用 cv2.bitwise_and 检查了它,我得到了一个黑色图像,表明没有白色像素偷工减料。

关于python - 是否可以以不切断角的方式在 python 中使用 OpenCV 轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654737/

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