cv2.floodfill是如何工作的?

2024-09-27 07:33:36 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个示例代码,显示了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

请帮忙


Tags: 函数代码图像import示例imgnpmask
1条回答
网友
1楼 · 发布于 2024-09-27 07:33:36

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

mask参数只填充应用了floodFill(),或者只想创建一个掩码而不修改图像。您可以在我的一个简单项目here上看到一个使用mask参数的示例。在这种情况下,我是模仿Adobe Photoshop魔术棒选择工具,所以我只需要面具,不想修改图像。

floodFill()所做的是,如果相邻像素在像素的某个阈值差内,则将像素与其相邻像素连接起来。四路连接检查上下左右两侧的邻居。此外,八路连接还检查对角线像素。这意味着,在边界像素处,您要么需要一堆if语句来不检查边界之外的像素,要么,您只需在图像的每一侧填充一个像素,这样就不需要特殊的情况,这两种情况在代码中读起来都更好,速度也更快。

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

相关问题 更多 >

    热门问题