解释参数含义在res = cv2.bitwise_and(img,img,mask = mask)

问题描述 投票:9回答:6

我试图提取输入图像的蓝色。为此,我使用该命令创建蓝色HSV颜色边界和阈值HSV图像

mask_img = cv2.inRange(hsv, lower_blue, upper_blue)

之后,我在输入图像和阈值图像上使用了bitwise_and

res = cv2.bitwise_and(img,img,mask = mask_img)

'img'是输入图像的位置。这段代码我是从opencv获得的。但是我不明白为什么在bitwise_and中使用了三个参数,实际上每个参数是什么意思?为什么在src1和src2使用相同的图像?

而且这里有mask关键字的用途是什么?请帮我找出答案

python opencv bitwise-and
6个回答
6
投票

这背后的基本概念是黑色的值,它在OPEN_CV中的值为0.So black + anycolor = anycolor,因为黑色的值为0。

现在假设我们有两个图像,一个名为img1,另一个是img2。 img2包含我们想要放在img1上的徽标。我们创建threshold然后创建img2的maskmask_inv,并创建img1的roi。现在我们要做两件事来在img1上添加img2的标识。我们在以下帮助下创建了roi的背景作为img1_bg:mask_inv,mask_inv将有两个区域一个黑色和一个白色,在白色区域我们将放置img1部分并留下黑色,因为它是 -

img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

在您的问题中,您直接使用了创建的img的掩码

res = cv2.bitwise_and(img,img,mask = mask_img)

在img2中我们需要创建徽标作为roi的前景,

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

在这里我们使用了遮罩层,img2的徽标部分填充在遮罩的白色部分现在当我们添加两个时,我们得到一个完美的组合roi完整描述和理解访问:OPEN CV CODE FILES AND FULL DESCRIPTION


5
投票

仅当mask [i]不等于零时才执行“And”的操作,否则操作的结果将为零。掩模应为单通道的白色或黑色图像。你可以看到这个链接http://docs.opencv.org/2.4.13.2/modules/core/doc/operations_on_arrays.html?highlight=bitwise#bitwise-and


2
投票

以下链接清楚地解释了按位运算以及每个参数的重要性。 http://opencvexamples.blogspot.com/2013/10/bitwise-and-or-xor-and-not.html

void bitwise_and(InputArray src1,InputArray src2,OutputArray dst,InputArray mask = noArray())

计算两个数组或数组和标量的每元素逐位连接。参数:src1 - 第一个输入数组或标量。

src2 - 第二个输入数组或标量。

src - 单输入数组。

值 - 标量值。

dst - 与输入数组具有相同大小和类型的输出数组。 mask - 可选操作掩码,8位单通道数组,指定要更改的输出数组的元素


2
投票

从上面的答案我们可能知道bitwise_and()参数的定义,但它们都没有回答其他问题

为什么在src1和src2使用相同的图像?

这个问题应该由OpenCV文档中过于简化的函数定义引起,对某些人来说可能不明确,在文档中bitwise_and()定义为

dst(I)= sur1(I)^ sur2(I),如果mask(I)!= 0,其中^表示'和'运算符

从这个定义一见钟情我无法得到当掩码(I)为0时如何处理dst(I)的图片。

从测试结果来看,我认为它应该给出一个更清晰的函数定义

dst(I)= sur1(I)^ sur2(I),如果掩码(I)!= 0,

否则dst(I)保持其原始值,dst数组的所有元素的默认值为0。

现在我们可以知道对于sur1和sur2使用相同的图像,它只会将原始图像部分保留在mask(I)的区域中!= 0而另一个区域显示dst图像的一部分(作为掩模形状)

另外对于其他按位操作,定义应与上面相同,它们还需要添加其他条件和dst数组的默认值描述


2
投票

实际上每个论点的意思是什么? res = cv2.bitwise_and(img,img,mask = mask_img)

src1:第一个图像(合并的第一个对象)src2:第二个图像(合并的第二个对象)mask:理解为要合并的规则。如果图像的区域(灰度缩放,然后被遮罩)具有黑色(值为0),则不合并(第一图像的合并区域与第二图像的合并区域)。反之亦然,它将被执行。在您的代码中,引用的图像是“mask_img”。在我的情况下,我的代码是正确的,当它使白色+ anycolor = anycolor;导入cv2导入numpy为np

# Load two images
img1 = cv2.imread('bongSung.jpg')
img2 = cv2.imread('opencv.jpg')

# I want to put logo on top-left corner, so I create a ROI 
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]

# NOw we need to create a mask of the logo, mask is conversion to grayscale of an image
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('mask', mask)

mask_inv = cv2.bitwise_not(mask)
#cv2.imshow("mask_inv", mask_inv)

#When using bitwise_and() in opencv with python then white + anycolor = anycolor; black + anycolor = black 
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
#cv2.imshow("img1_bg", img1_bg)

cv2.imshow("img2", img2)

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
cv2.imshow('img2_fg', img2_fg)

dst = cv2.add(img1_bg,img2_fg)

img1[0:rows, 0:cols] = dst

#cv2.imshow("Image", img1)
cv2.waitKey(0)

cv2.destroyAllWindows()

0
投票

关于使用img两次,我的猜测是我们并不关心img [i]和img [i]是什么,因为它只是img [i] for binary。重要的是,正如Mohammed Awney所提到的,当掩码为0时,我们将img [i]设为0,否则我们将像素单独留下。根据我们的面具,这是一种使img变成黑色的像素的方法。

© www.soinside.com 2019 - 2024. All rights reserved.