下面是一个示例代码,显示了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行)
下面是示例代码的输入和输出。
请帮忙
当前实现的简短答案是不需要使用该参数。您只需在调用中将
mask1
替换为None
,因为您不使用它。查看我的答案here、here和here,查看不带掩码参数的floodFill()
示例。mask参数只填充应用了
floodFill()
的,或者只想创建一个掩码而不修改图像。您可以在我的一个简单项目here上看到一个使用mask参数的示例。在这种情况下,我是模仿Adobe Photoshop魔术棒选择工具,所以我只需要面具,不想修改图像。floodFill()
所做的是,如果相邻像素在像素的某个阈值差内,则将像素与其相邻像素连接起来。四路连接检查上下左右两侧的邻居。此外,八路连接还检查对角线像素。这意味着,在边界像素处,您要么需要一堆if
语句来不检查边界之外的像素,要么,您只需在图像的每一侧填充一个像素,这样就不需要特殊的情况,这两种情况在代码中读起来都更好,速度也更快。通常,这只是在函数内部完成的,不向用户公开。但是,
floodFill()
被设计为在需要时在图像上多次调用,因此每次调用时创建一个新的填充Mat
会使函数变慢。因此,我相信,填充是传递给用户的,因此如果他们多次调用函数,填充的掩码只创建一次。相关问题 更多 >
编程相关推荐