Python 从与遮罩的黑色像素相交的图像中剪切或删除像素

Python 从与遮罩的黑色像素相交的图像中剪切或删除像素,python,image,opencv,Python,Image,Opencv,我正在尝试使用Python使用OpenCV剪切两幅图像 我们的想法是使用像这样的图像: 作为面具。注意:这只是一个例子 因此,如果我将这个遮罩减去另一个图像,我将得到一个原始像素仅与遮罩中的白色矩形位于同一位置的图像。因此,我们的想法是从第一幅图像中移除与遮罩中黑色像素所在位置相同的像素 我怎么做 也许我可以在两个图像之间执行和操作(遮罩只有0(黑色)和1(白色像素).如果您要问的是如何在遮罩为黑色时使图像透明,在遮罩为白色时使图像不透明,那么只需将遮罩添加到输入的alpha通道中即可。以下是

我正在尝试使用Python使用OpenCV剪切两幅图像

我们的想法是使用像这样的图像:

作为面具。注意:这只是一个例子

因此,如果我将这个遮罩减去另一个图像,我将得到一个原始像素仅与遮罩中的白色矩形位于同一位置的图像。因此,我们的想法是从第一幅图像中移除与遮罩中黑色像素所在位置相同的像素

我怎么做


也许我可以在两个图像之间执行操作(遮罩只有0(黑色)和1(白色像素).

如果您要问的是如何在遮罩为黑色时使图像透明,在遮罩为白色时使图像不透明,那么只需将遮罩添加到输入的alpha通道中即可。以下是如何在Python/OpenCV中做到这一点。(根据Mark Setchell的评论进行修订)

输入:

遮罩:


结果:

我就是这样做的

输入数组的形状为
(240240)
,输出数组的形状为
(240240)

我将使用
mask
数组中的索引屏蔽
image
数组中的索引,这些索引的值为0

def cut_out(image, mask):
    if type(image) != np.ndarray:
        raise TypeError("image must be a Numpy array")
    elif type(mask) != np.ndarray:
        raise TypeError("mask must be a Numpy array")
    elif image.shape != mask.shape:
        raise ValueError("image and mask must have the same shape")

    return np.where(mask==0, 0, image)

为什么不直接反转掩码和按位_并用它呢?
inversed_mask=255-mask
你说的删除是什么意思?你希望它们是透明的还是可能是白色的?或者你希望将图像裁剪到与白色矩形相同的边界?很好!或者更简单地说,将以
result
开头的3行替换为
result=np.dst确认((img,掩码))
谢谢你的改进,Mark。根据编辑我的图像大小相同。请下载,你会看到。图像的其余部分是透明的,因此在这里查看时背景是白色的,因此不会显示。因此它看起来更小。我没有将图像写入文件。在我的情况下,
img
mask
是具有
(240,240)
形状的Numpy数组,结果是
(240,240,2)
。这是否正确,因为我需要具有
(240,240)
形状的结果。我的颜色输入是(256256,3)。我的结果图像包括alpha通道,所以是(256256,4),即4个通道。如果您的输入是(240240)这意味着它是灰度的。因此,如果您通过np.dstack()添加掩码,您将得到(240240,2)。
def cut_out(image, mask):
    if type(image) != np.ndarray:
        raise TypeError("image must be a Numpy array")
    elif type(mask) != np.ndarray:
        raise TypeError("mask must be a Numpy array")
    elif image.shape != mask.shape:
        raise ValueError("image and mask must have the same shape")

    return np.where(mask==0, 0, image)