如何在 Python OpenCV 中删除轮廓内的轮廓?

Posted

技术标签:

【中文标题】如何在 Python OpenCV 中删除轮廓内的轮廓?【英文标题】:How to remove a contour inside contour in Python OpenCV? 【发布时间】:2016-09-25 13:10:32 【问题描述】:

Python 中的 OpenCV 提供以下代码:

regions, hierarchy = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)


for region in regions:
    x, y, w, h = cv2.boundingRect(region)

    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)

这给出了轮廓内的一些轮廓。如何在 Python 中删除它们?

【问题讨论】:

【参考方案1】:

为此,您应该查看this tutorial,了解如何使用方法findContours 返回的hierarchy 对象。

重点是您应该使用cv2.RETR_TREE 而不是cv2.RETR_LIST 来获取集群之间的父/子关系:

regions, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

然后您可以通过检查hierarchy[0,i,3] 是否等于-1 来检查索引为i 的轮廓是否在另一个轮廓内。如果它不同于-1,那么你的轮廓在另一个里面。

【讨论】:

谢谢!你救了我。 即使在应用 cv2.RETR_TREE 后仍会在其他轮廓内获得轮廓,可以执行哪些步骤?怎样才能彻底解决? 您不想使用 cv2.RETR_EXTERNAL,因为他想删除另一个轮廓内的所有轮廓吗?【参考方案2】:
img_output, contours, hierarchy = cv2.findContours(blank_image_firstImage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

这会移除子轮廓

【讨论】:

这只查找外部轮廓,不删除轮廓内的轮廓。如果整个图像有一个大轮廓,那么它只返回那个。 谢谢!通过首先修复导致问题的步骤,这解决了我与原始问题相关的问题。

以上是关于如何在 Python OpenCV 中删除轮廓内的轮廓?的主要内容,如果未能解决你的问题,请参考以下文章

opencv如何读取多边形区域内的像素值?

获取轮廓Opencv Python内的区域?

opencv查找轮廓后如何改变轮廓内的颜色C++

如何使用opencv绘制轮廓内的区域? (图片是从 dxf 文件导出的)[关闭]

如何在 OpenCV - Python 中获得没有冗余的内部轮廓点

如何在 python opencv 中完成/关闭轮廓?