我在看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)
这些线实际上做了什么,以及如何应用掩蔽?你知道吗
如果有人能解释在按位运算中应用的掩蔽,那将是真正的很有帮助。谢谢你知道吗
如果你看看tutorial。你知道吗
遮罩是OpenCV徽标的黑白图像,它是通过对OpenCV徽标应用阈值创建的。你知道吗
bitwise_and
操作是logical and operation在这种情况下,取两个代表一个像素的8位数字,并对这些数字应用and运算。你知道吗
Documentation描述此函数的作用。你知道吗
由于前两个参数是相同的(都是
roi
或img2
),如果不使用遮罩,结果将是相同的图像。遮罩为黑色的位置与目标图像保持相同。你知道吗在这种情况下,没有提供目标图像,因此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_bg
和img2_fg
时,结果只是每个图像中被遮罩的部分。你知道吗就我个人而言,我认为这是一个混乱的使用
bitwise_and
。我认为为了演示bitwise_and
的功能,删除mask参数会更清楚,如下所示:img1_bg = cv.bitwise_and(roi, mask_inv)
。这将得到相同的结果,在遮罩为黑色时为零,而在遮罩不为黑色时为ROI值,因为遮罩的像素全部为1或全部为零。你知道吗如果您不想演示
bitwise_and
的用法,那么在python中使用逻辑索引会更清楚,如下所示:相关问题 更多 >
编程相关推荐