屏蔽具有多列条件的数组

时间:2015-12-15 15:28:57

标签: python multidimensional-array

我正在使用NxMx3阵列,它实际上是一个大小为NxM的RGB图像。我想使用像素必须与已知颜色不同的条件来遮盖此图像中的一些像素。我不想依赖外部图像处理库,所以我尝试了numpy蒙面数组和类似的,暂时没有太大的成功。

我希望我能写出类似的东西:

A = np.array([[[255,0,255],[0,255,0]],[[128,0,128],[0,128,0]]]) # 2x2x3
mask = A[:,:] != np.array([0, 255, 0]) # Mask green pixel

但是这段代码不能用作 I ,因为它部分掩盖了我想要保留的元素(0[0,128,0] s也被屏蔽了) 。我尝试了很多不同的东西,大多数都没有因尺寸不匹配而运行,但这里是我找到的最短的 - 工作示例!

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以先将A(0, 255, 0)进行比较,以获得形状(2,2,3)的布尔掩码。当通道值等于broadcasted元组中的对应值时,它为True:

In [26]: A != (0, 255, 0)
Out[26]: 
array([[[ True,  True,  True],
        [False, False, False]],

       [[ True,  True,  True],
        [False,  True, False]]], dtype=bool)

由于广播根据需要在左侧添加新轴,因此与{{1}相比,元组被广播为形状(1,1,3)的数组,然后进一步广播成形(2,2,3) }。因此,元组中的组件值与A中相应组件值的右侧进行比较。

现在获取形状(2,2)的布尔掩码,当所有通道组件等于给定像素的元组时为True,使用A

any

In [27]: (A != (0, 255, 0)).any(axis=2) Out[27]: array([[ True, False], [ True, True]], dtype=bool) 减少沿最后一个轴的形状(2,2,3)的布尔数组。如果沿最后一个轴的值​​的任何为True,则结果为True。