SAC*_*HIN 12 python opencv bitwise-and
我试图提取输入图像的蓝色.为此,我使用该命令创建蓝色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关键字的用途是什么?请帮我找出答案
小智 9
每个论点实际上是什么意思?
res = cv2.bitwise_and(img,img,mask = mask_img)
src1:第一张图片(合并的第一个对象)
src2:第二张图片(合并的第二个对象)
掩码:理解为要合并的规则。如果图像区域(灰度化,然后遮罩)为黑色(值为0),则不合并(将第一张图像的区域与第二张图像的区域合并),反之亦然,它将是执行。在您的代码中,引用的图像是“mask_img”。
就我而言,我的代码是正确的,当它使 white + anycolor = anycolor
import cv2
import numpy as 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()
Run Code Online (Sandbox Code Playgroud)
小智 8
这背后的基本概念是黑色的值,在OPEN_CV中它的值为0.所以黑色+ anycolor = anycolor,因为黑色的值为0。
现在假设我们有两个图像,一个是命名img1,另一个是img2。img2包含一个我们想要放置在img1上的徽标。我们先创建img2 threshold的mask和mask_inv,再创建roiimg1。现在,我们必须做两件事才能在img1上添加img2的徽标。我们在以下帮助下将roi的背景创建为img1_bg:mask_invmask_inv将具有两个区域,一个为黑色,一个为白色,在白色区域中,我们将放置img1部分,并将黑色保持原样-
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
Run Code Online (Sandbox Code Playgroud)
在您的问题中,您直接使用了创建的img的蒙版
res = cv2.bitwise_and(img,img,mask = mask_img)
Run Code Online (Sandbox Code Playgroud)
在img2中,我们需要创建徽标作为roi的前景,
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用了遮罩层,img2的徽标部分被遮罩的白色部分填充了。现在,当我们同时添加两者时,我们得到了一个完美的组合roi。有关完整的描述和理解,请访问: 打开CV代码文件和完整描述
从上面的回答我们可能知道bitwise_and()的参数定义,但都没有回答另一个问题
为什么在 src1 和 src2 使用相同的图像?
这个问题应该是OpenCV文档中函数定义过于简单导致的,可能有些人会比较含糊,文档中bitwise_and()定义为
dst(I)=sur1(I) ^ sur2(I), if mask(I) != 0, 其中^代表'与'运算符
从这个定义乍一看,我无法获得有关如何在掩码(I)为 0 时处理 dst(I) 的图片。
从测试结果来看,我认为应该给出更清晰的函数定义为
dst(I)=sur1(I) ^sur2(I), 如果 mask(I) != 0,
否则 dst(I) 保持其原始值,dst 数组所有元素的默认值为 0。
现在我们可能知道,sur1 和 sur2 使用相同的图像,它只会保留 mask(I) !=0 区域中的原始图像部分,其他区域显示 dst 图像的部分(作为掩码形状)
另外其他按位运算的定义应该和上面一样,还需要加上otherwise条件和dst数组的默认值描述
仅当mask [i]不等于零时,才会执行“与”运算,否则,和运算的结果将为零。蒙版应为单通道的白色或黑色图像。您可以看到此链接 http://docs.opencv.org/2.4.13.2/modules/core/doc/operations_on_arrays.html?highlight=bitwise#bitwise-and
小智 0
下面的链接清楚地解释了按位运算以及每个参数的含义。\n http://opencvexamples.blogspot.com/2013/10/bitwise-and-or-xor-and-not.html
\n\nvoid bitwise_and(InputArray src1、InputArray src2、OutputArray dst、InputArray mask=noArray())
\n\n计算两个数组或一个数组和一个标量的每个元素的按位合取。\n参数:\nsrc1 \xe2\x80\x93 第一个输入数组或标量。
\n\nsrc2 \xe2\x80\x93 第二个输入数组或标量。
\n\nsrc \xe2\x80\x93 单输入数组。
\n\n值 \xe2\x80\x93 标量值。
\n\ndst \xe2\x80\x93 输出数组,其大小和类型与输入数组相同。\nmask \xe2\x80\x93 可选操作掩码,8 位单通道数组,指定要更改的输出数组的元素
\n