gpt4 book ai didi

python - 如何使用 python opencv 提取内部轮廓(孔)?

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

有没有一种简单直接的方法可以使用 opencv 3.1 python 从图像中提取内部轮廓(孔)?

我知道我可以使用“区域”作为条件。但是,如果我更改图像分辨率,“区域”就不一样了。

例如,这张图片: enter image description here如何提取内部孔?

_, contours, hier_ = cv2.findContours(img,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(c) for c in millCnts]
max_area = np.max(areas)
Mask = np.ones(img.shape[:2], dtype="uint8") * 255

# I can do something like this (currently not working, just to show an example)
for c in contours:
if(( cv2.contourArea(c) > 8) and (cv2.contourArea(c)< 100000)):
cv2.drawContours(Mask ,[c],-1,0,1)

最佳答案

正如我在评论中解释的那样,您必须检查层次结构返回变量。找到等高线后,您将获得等高线(点列表列表)和层次结构(列表列表)。

documentation这点很清楚:

hierarchy – Optional output vector, containing information about the image topology. It has as many elements as the number of contours. For each i-th contour contours[i] , the elements hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , and hiearchy[i][3] are set to 0-based indices in contours of the next and previous contours at the same hierarchical level, the first child contour and the parent contour, respectively. If for the contour i there are no next, previous, parent, or nested contours, the corresponding elements of hierarchy[i] will be negative.

因此,这意味着对于每个 countour[i],您应该得到一个 hierarchy[i],其中包含一个包含 4 个变量的列表:

  • hierarchy[i][0]: 下一个同级轮廓的索引
  • hierarchy[i][1]: 同层上一个轮廓的索引
  • hierarchy[i][2]: 第一个 child 的索引
  • hierarchy[i][3]:父级的索引

因此,在您的情况下,应该有一个没有父级的,如果它是负数,您可以通过检查 hierarchy[i][3] 来检查是哪一个。

它应该是这样的(未经测试的代码):

holes = [contours[i] for i in range(len(contours)) if hierarchy[i][3] >= 0]

* 更新:*

总结一下我们在聊天中讨论的内容,

  • 图像太大,轮廓有小孔:用75大小的核扩张和腐 eclipse 解决
  • 图像需要反转,因为 OpenCV 需要扩大黑色背景
  • 该算法给出了 2 个大轮廓,一个在外面(如预期的那样),一个在里面(几乎与外面的一样),这可能是由于图像有一些外部(和封闭的)凸起。这是通过删除没有 parent 及其第一个 child 的轮廓来解决的。

关于python - 如何使用 python opencv 提取内部轮廓(孔)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37160143/

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