是否在Opencv Python轮廓中获取区域?

问题描述 投票:15回答:2

我已经使用了自适应阈值技术来创建类似下面的图片:

“在此处输入图像描述”

我使用的代码是:

image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)

然后,我使用此代码获取轮廓:

cnt = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]

我的目标是使用外部轮廓内的所有像素生成蒙版,因此我想将对象内的所有像素填充为白色。我该怎么办?

我已经尝试过下面的代码来创建遮罩,但是所得到的遮罩似乎与应用自适应阈值后的图像没有区别

mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)
python opencv image-processing opencv-contour
2个回答
16
投票
具有间隙。具体来说,您所追求的是期望鞋子的周长被连接起来。如果发生这种情况,那么如果您提取最外部的轮廓(这就是您的代码正在执行的操作),则只能有一个轮廓代表对象的外围。填充轮廓后,鞋子应该完全结实。

由于鞋子的周长不完整且不完整,因此会导致白色区域断开连接。如果使用findContours查找所有轮廓,它将仅查找每个白色形状的轮廓,而不是最外围。因此,如果您尝试使用findContours,它将获得与原始图像相同的结果,因为您只是找到图像内每个白色区域的周长,然后用findContours填充这些区域。

您需要做的是确保图像

完全

关闭。我建议您执行的操作是使用morphology一起关闭所有断开连接的区域,然后在此新映像上运行findContours调用。具体来说,执行二进制形态封闭。这样做的目的是要获取彼此靠近且未连接的白色区域,并确保它们已连接。使用形态上的闭合,也许使用类似7 x 7正方形的结构元素来闭合鞋子。您可以将这种结构元素视为白色区域之间的最小间隔,以将它们视为已连接。

因此,请执行以下操作:

import numpy as np import cv2 image = cv2.imread('...') # Load your image in here # Your code to threshold image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0) # Perform morphology se = np.ones((7,7), dtype='uint8') image_close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, se) # Your code now applied to the closed image cnt = cv2.findContours(image_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0] mask = np.zeros(image.shape[:2], np.uint8) cv2.drawContours(mask, cnt, -1, 255, -1)

此代码从本质上获取您的阈值图像,并对该图像进行形态学封闭。之后,我们找到该图像的外部轮廓,并用白色填充它们。 FWIW,我下载了您的阈值图像,并独自尝试了此操作。这就是我对您的图片的理解:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9NWkhHbC5wbmcifQ==” alt =“在此处输入图像描述”>

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.