cv2.floodfill如何工作?

时间:2017-11-27 18:38:05

标签: python opencv computer-vision

这是一个显示cv2.floodfill函数

用法的示例代码
import cv2
import numpy as np
import os

def imshow(img):
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


img = cv2.imread('test4.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,3,1)

_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)

mask = np.zeros(img.shape[:-1],np.uint8)

cv2.drawContours(mask,contours,-1,(255,255,255),-1)

height, width = img.shape[:-1]

mask1 = np.zeros((height+2, width+2), np.uint8)     # line 26
cv2.floodFill(mask,mask1,(0,0),255)     # line 27
mask_inv=cv2.bitwise_not(mask)

imshow(mask_inv)

我在我的一个项目中使用此功能,但我不理解代码的mask1部分(第26行和第27行) 就是这样,

为什么我们为具有高度的给定图像创建形状为h + 2,w + 2的mask1 - ' h'和宽度 - ' w'?(第26行)

为什么我们必须将这个mask1传递给cv2.floodfill函数?(第27行)

这是示例代码的输入和输出。

输入图片 input image

输出图像 output image

请帮助

1 个答案:

答案 0 :(得分:6)

您当前实施的简短答案是您不需要使用该参数。您可以在呼叫中简单地将mask1替换为None,因为您没有使用它。查看我的答案hereherehere,查看没有掩码参数的floodFill()示例。

mask参数只需填写,其中 floodFill()已应用,或者您只想创建一个遮罩而不修改图像。您可以使用mask参数在我的一个简单项目here上查看示例。在这种情况下,我模仿Adobe Photoshop Magic Wand选择工具,所以我只需要掩码并且不想修改图像。

如果邻居在像素的某个阈值差异内,floodFill()做的是将像素连接到它的邻居。四向连接检查上方和下方以及左侧和右侧的邻居。八向连接另外检查对角线像素。这意味着在边框像素处,您需要一堆if语句才能检查边框外的像素,或者,您可以简单地在每侧填充一个像素的图像,这样您就不会需要特殊情况,它们在代码中读取得更好并且更快。

通常,这只是在函数内部完成而不是暴露给用户。但是,如果需要,floodFill()会被设计为在图像上多次调用,因此每次调用时都会创建一个新的填充Mat会使函数变慢。所以相反,我相信,填充会传递给用户,这样如果他们多次调用该函数,填充掩码只会创建一次。