【问题标题】:How masking is applied in bitwise_operation in opencv?如何在 opencv 的 bitwise_operation 中应用掩码?
【发布时间】:2019-07-15 06:10:04
【问题描述】:

我在查看 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)

这些行实际上做了什么以及如何应用屏蔽?

如果有人能解释在 bitwise_and 操作中应用的掩码,那将非常有帮助。谢谢

【问题讨论】:

    标签: python opencv bitwise-operators bitwise-and


    【解决方案1】:

    如果您查看tutorial

    蒙版是 OpenCV 徽标的黑白图像,它是通过对 OpenCV 徽标应用阈值创建的。

    bitwise_and 操作是 logical and operation

    在这种情况下,它采用两个代表一个像素的 8 位数字,并对这些数字应用与运算。

    Documentation 描述了这个函数的作用。

    由于前两个参数相同(roiimg2),如果不使用蒙版,结果将是相同的图像。蒙版为黑色的地方与目标图像相同。

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

    特别是img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv) 将创建一个用于函数的黑色矩阵,该矩阵后来成为img1_bg 的输出。只有与mask_inv 中的白色像素匹配的黑色图像的部分被roi 中的像素填充。这意味着在有白色像素的 mask_inv 中。 roi值会被复制到函数生成的纯黑色图像中对应的坐标。

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

    这使得当您添加 img1_bgimg2_fg 时,结果只是每个图像中被屏蔽的部分。

    就个人而言,我认为bitwise_and 的用法令人困惑。我认为为了演示bitwise_and 的功能,删除掩码参数会更清楚,如下所示:img1_bg = cv.bitwise_and(roi, mask_inv)。这将给出相同的结果,在掩码为黑色的情况下为 0,而在不为黑色的情况下为 ROI 值,因为掩码的像素全为 1 或全为零。

    如果你不想展示bitwise_and的用法,我认为在python中使用逻辑索引会更清晰:

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

    【讨论】:

    • 您能否再解释一下“然后在 mask_inv 或 mask 白色像素中分别用 roi 或 img2 填充黑色矩阵,其余部分为黑色”
    • 如果您认为这个问题将来可能对其他用户有帮助,请点赞。
    • 我编辑了我的帖子以帮助澄清。我希望现在更清楚了。
    • 这一行“只有与 mask_inv 中的白色像素匹配的黑色图像的部分才用来自 roi 的像素填充”这一行怎么样?每个像素值为零的黑色图像如何与蒙版中的白色像素匹配?
    • 黑色图像与蒙版大小相同。纯黑色图像中的像素坐标与蒙版图像中像素的坐标相匹配。
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2018-08-10
    • 2019-01-12
    相关资源
    最近更新 更多