如何在 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绘制轮廓内的区域? (图片是从 dxf 文件导出的)[关闭]