我有两个numpy数组。一个是维度为(988,790,3)的3D整数数组(图像RGB值),另一个是具有相同形状的掩码布尔数组。我想使用蒙版将图像数组中的False值转换为黑色,并保留True值不变。我尝试了(image & mask),它似乎将整个图像转换为黑色(或白色),而不仅仅是False位置。我想避免循环的效率,所以寻找一个 numpy 解决方案。
(image & mask)
wlwcrazw1#
由于True和False值分别被视为1和0,因此您可以简单地使用元素乘法来获得所需的结果:
True
False
1
0
image * mask
mmvthczy2#
你可以使用np.where。如果你的面具也是3D的,那么np.where(mask, image, 0)应该可以。但怀疑你的面具是二维的...
np.where
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来得到一个已经有这样一个拖尾轴的遮罩;这可以稍微清理一下代码。结果:
mask
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]]])
2条答案
按热度按时间wlwcrazw1#
由于
True
和False
值分别被视为1
和0
,因此您可以简单地使用元素乘法来获得所需的结果:mmvthczy2#
你可以使用
np.where
。如果你的面具也是3D的,那么np.where(mask, image, 0)
应该可以。但怀疑你的面具是二维的...注意,在上面的例子中,我假设
mask
只有2个维度;它不具有拖尾沟道尺寸。为了使np.where
工作,它的值需要是可广播的,我在上面通过将形状为1的拖尾轴插入到掩码中来实现这一点。PS:如果你根据你的图像计算你的遮罩,你可以在计算中的某个地方使用关键字参数
keepdims=True
来得到一个已经有这样一个拖尾轴的遮罩;这可以稍微清理一下代码。结果: