如何在opencv的按位运算中应用掩蔽?

2024-04-18 11:16:51 发布

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

我在看OpenCV的文档时发现了一些我不能理解的东西。我试图在网上找到它,但没有找到任何令人满意的。你能帮我写一行代码吗? 代码如下:

# Load two images
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 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 create a mask of logo and create its inverse mask also
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

我不明白的是这两行

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

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

这些线实际上做了什么,以及如何应用掩蔽?你知道吗

如果有人能解释在按位运算中应用的掩蔽,那将是真正的很有帮助。谢谢你知道吗


Tags: andofcreatemaskcvrowslogoimg1
1条回答
网友
1楼 · 发布于 2024-04-18 11:16:51

如果你看看tutorial。你知道吗

遮罩是OpenCV徽标的黑白图像,它是通过对OpenCV徽标应用阈值创建的。你知道吗

bitwise_and操作是logical and operation

在这种情况下,取两个代表一个像素的8位数字,并对这些数字应用and运算。你知道吗

Documentation描述此函数的作用。你知道吗

由于前两个参数是相同的(都是roiimg2),如果不使用遮罩,结果将是相同的图像。遮罩为黑色的位置与目标图像保持相同。你知道吗

在这种情况下,没有提供目标图像,因此OpenCV为函数中使用的目标图像分配一个黑色图像(零)(这通常是OpenCV在函数没有提供矩阵时的工作方式)。你知道吗

具体地说,img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)将创建一个用于函数的黑色矩阵,该矩阵稍后将成为输出img1_bg。只有与mask_inv中的白色像素匹配的黑色图像部分被roi中的像素填充。这意味着在mask\u inv中有白色像素。roi值将被复制到函数生成的纯黑色图像的相应坐标中。你知道吗

类似地img2_fg = cv.bitwise_and(img2,img2,mask = mask)将创建一个用于函数中的黑色矩阵,该矩阵稍后将成为输出img2_fg。只有这个黑色图像中与mask中的白色像素匹配的部分被img2中的像素填充。你知道吗

这使得当您添加img1_bgimg2_fg时,结果只是每个图像中被遮罩的部分。你知道吗

就我个人而言,我认为这是一个混乱的使用bitwise_and。我认为为了演示bitwise_and的功能,删除mask参数会更清楚,如下所示:img1_bg = cv.bitwise_and(roi, mask_inv)。这将得到相同的结果,在遮罩为黑色时为零,而在遮罩不为黑色时为ROI值,因为遮罩的像素全部为1或全部为零。你知道吗

如果您不想演示bitwise_and的用法,那么在python中使用逻辑索引会更清楚,如下所示:

output = np.zeros(img1.shape, np.uint8)
output[mask_inv] = img1_bg[mask_inv]
output[mask] = img2_fg[mask]

相关问题 更多 >