首页 文章

在Opencv Python中获取轮廓区域?

提问于
浏览
13

我使用自适应阈值技术来创建如下图片:

enter image description here

我使用的代码是:

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)

1 回答

  • 14

    你拥有的几乎是正确的 . 如果你看看你的阈值图像,它不起作用的原因是因为你的鞋子对象 has gaps 在图像中 . 具体来说,你所追求的是你希望鞋子的周长连接起来 . 如果发生这种情况,那么如果你提取最外部轮廓(这是你的代码正在做的),你应该只有一个代表对象外围的轮廓 . 一旦填写轮廓,那么你的鞋应该是完全坚固的 .

    由于鞋子的周边不完整和破损,这会导致白色区域断开 . 如果你使用 findContours 来查找所有轮廓,它只能找到每个白色形状的轮廓而不是最外层的轮廓 . 因此,如果您尝试使用 findContours ,它只需查找图像中每个白色区域的周长,然后使用 findContours 填充这些区域 .


    您需要做的是确保图像关闭 completely . 我建议你做的是使用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,我下载了你的thresholded图像,并自己尝试了 . 这就是我对你的形象的看法:

    enter image description here

相关问题