【问题标题】:What's the difference b/w (mask=mask) and (mask=mask_inverse) on OpenCV?OpenCV 上的 b/w (mask=mask) 和 (mask=mask_inverse) 有什么区别?
【发布时间】:2020-01-25 06:33:54
【问题描述】:

有人能指出他们之间工作的区别吗?我是 OpenCV 的新手,所以他们之间的工作几乎没有混淆。

import cv2
import numpy as np
img1 = cv2.imread('D:\Downloads_Chrome\python.png',cv2.IMREAD_COLOR)
img2 = cv2.imread('D:\Downloads_Chrome\graph2.jpeg',cv2.IMREAD_COLOR)
rows, cols, channel = img1.shape
roi = img2[0:rows, 0:cols]
img1_2gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img1_2gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
img2_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)
img1_fg = cv2.bitwise_and(img1,img1,mask=mask)
dest = cv2.add(img2_bg, img1_fg)
img2[0:rows, 0:cols] = dest
cv2.imshow('res',img2)
cv2.imshow('mask_inv',mask_inv)
cv2.imshow('mask',mask)
cv2.imshow('img2_bg',img2_bg)
cv2.imshow('img1_fg',img1_fg)
cv2.imshow('dest',dest)
cv2.imshow('img1_2gray',img1_2gray)
cv2.imshow('image1',img1)
#cv2.imshow('image2',img2)
if cv2.waitKey(0):
    cv2.destroyAllWindows()

【问题讨论】:

  • 如果您不包含mask_invmask 的定义,我们怎么知道? :)
  • 我希望编辑解决了查询。谢谢。

标签: python-3.x opencv computer-vision


【解决方案1】:

在您的代码中,mask 是一个二进制图像,用于定义/获取图像中您想要的区域。考虑

I2=cv2.bitwise_and(I1,mask)

由于mask 是二进制的,所以会发生以下情况:mask 设置为0,图像I2 将为0。但是,mask 设置为1 的所有位置,图片I2 将保留与I1 相同的内容。

现在,正如@MH304 指出的那样,mask_inv 只是和图像这样定义(使用binary_not):

mask_inv[i,j]=0  <=> mask[i,j]=1
mask_inv[i,j]=1  <=> mask[i,j]=0
#or equivalently, mask_inv[i,j]=1-mask[i,j]

所以,做

I3=cv2.bitwise_and(I1,mask_inv)

意味着I3 将保留您从I1 丢弃的所有内容,以形成I2。同样,I3 将丢弃您从I1 使用的所有内容,形成I2。所以在某种意义上,I2I3 是互补的(例如 forground/background)。

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多