基于布尔掩码转换numpy图像数组

7cjasjjr  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(212)

我有两个numpy数组。一个是维度为(988,790,3)的3D整数数组(图像RGB值),另一个是具有相同形状的掩码布尔数组。我想使用蒙版将图像数组中的False值转换为黑色,并保留True值不变。
我尝试了(image & mask),它似乎将整个图像转换为黑色(或白色),而不仅仅是False位置。我想避免循环的效率,所以寻找一个 numpy 解决方案。

wlwcrazw

wlwcrazw1#

由于TrueFalse值分别被视为10,因此您可以简单地使用元素乘法来获得所需的结果:

image * mask
mmvthczy

mmvthczy2#

你可以使用np.where。如果你的面具也是3D的,那么np.where(mask, image, 0)应该可以。但怀疑你的面具是二维的...

import numpy as np

H, W = 2, 4

image = np.arange(1, 25).reshape(H, W, 3)
mask = np.random.choice([True, False], size=(H, W))

out = np.where(mask[..., None], image, 0)

注意,在上面的例子中,我假设mask只有2个维度;它不具有拖尾沟道尺寸。为了使np.where工作,它的值需要是可广播的,我在上面通过将形状为1的拖尾轴插入到掩码中来实现这一点。
PS:如果你根据你的图像计算你的遮罩,你可以在计算中的某个地方使用关键字参数keepdims=True来得到一个已经有这样一个拖尾轴的遮罩;这可以稍微清理一下代码。
结果:

>>> image
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]],

       [[13, 14, 15],
        [16, 17, 18],
        [19, 20, 21],
        [22, 23, 24]]])
>>> mask
array([[False,  True, False,  True],
       [ True, False,  True, False]])
>>> out
array([[[ 0,  0,  0],
        [ 4,  5,  6],
        [ 0,  0,  0],
        [10, 11, 12]],

       [[13, 14, 15],
        [ 0,  0,  0],
        [19, 20, 21],
        [ 0,  0,  0]]])

相关问题