Python cv2.1溢流填料是如何工作的?

Python cv2.1溢流填料是如何工作的?,python,opencv,computer-vision,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 = cv

下面是显示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)
我在一个me项目中使用此函数,但我不理解代码的mask1部分(第26行和第27行) 就是

为什么我们要为高度为“h”、宽度为“w”的给定图像创建形状为h+2、w+2的mask1?(第26行)

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

下面是示例代码的输入和输出

输入图像

输出图像


请帮助

当前实现的简短回答是不需要使用该参数。您只需在调用中将
mask1
替换为
None
,因为您没有使用它。查看我的答案,并查看不带mask参数的
floodFill()
示例

mask参数只是在应用了
floodFill()
的地方填充,或者如果您只想创建一个掩码而不想修改图像,那么就填充。您可以在我使用mask参数的一个简单项目上看到一个示例。在本例中,我模拟了Adobe Photoshop魔杖选择工具,因此我只需要遮罩,不想修改图像

floodFill()
所做的是将像素与其相邻像素连接起来,前提是相邻像素的阈值差在某个范围内。四向连接检查上方和下方以及左侧和右侧的邻居。另外,八向连通性检查对角线像素。这意味着在边界像素处,您或者需要一组
if
语句来不检查边界外的像素,或者,您可以简单地在图像的每一侧填充一个像素,这样您就不需要特殊情况,这两种情况在代码中读取效果更好,速度更快


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

可能是因为这个事实。(它需要在前面有一个
CV\u EXPORTS\u W
,而不仅仅是
CV\u EXPORTS
)请注意,如果不使用参数,您可以对
mask1
使用
None
。@AlexanderReynolds我想这可以解释为什么没有包装其他重载。@DanMašek我怀疑您需要包含形状
(h+2,w+2)的掩码的原因
只是为了使基础函数不需要在每次调用函数时创建新的填充掩码(对于边界像素)。对于重复调用,
floodFill()
,最好在调用之前只创建一次填充掩码。