gpt4 book ai didi

python - cv2.floodfill 如何工作?

转载 作者:行者123 更新时间:2023-12-02 16:13:01 33 4
gpt4 key购买 nike

这是一个示例代码,显示了 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”和宽度为“w”的给定图像创建形状为 h+2、w+2 的 mask1?(第 26 行)

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

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

输入图像
input image

输出图像
output image

请帮忙

最佳答案

您当前实现的简短回答是您不需要使用该参数。您可以简单地替换 mask1None在通话中,因为您没有使用它。查看我的回答 here , here , 和 here查看 floodFill() 的示例没有掩码参数。

掩码参数简单地填入floodFill()已应用,或者如果您只想创建一个蒙版而不是修改您的图像。您可以在我的一个简单项目中看到一个示例 here使用掩码参数。在这种情况下,我模仿了 Adob​​e Photoshop Magic Wand 选择工具,因此我只需要蒙版,不想修改图像。

什么 floodFill()如果邻居在像素的某个阈值差异内,则将像素连接到它的邻居。四向连通性检查上方和下方以及左侧和右侧的邻居。八向连通性还检查对角线像素。这意味着在边界像素处,您要么需要一堆 if不检查边界外像素的语句,或者,您可以简单地在图像的每一侧填充一个像素,这样您就不需要特殊情况,这两种情况在代码中读取效果更好,速度更快。

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

关于python - cv2.floodfill 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517667/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com