首页 > 解决方案 > 如何在 3d numpy 数组中选择“黑色”单元格?

问题描述

我有一个 NumPy 形状数组(512, 512, 3)(即 RGB 图像)。该数组是从一个二进制掩码创建的,我用 Pillow 将它读入一个 3d 数组:

data = np.array(Image.open(mask).convert('RGB'))

我想将蒙版中对象的颜色更改为 RGB 颜色。为此,我需要选择数组中所有 3 个维度中值不为零的所有单元格(0,0,0)= black),因为这是背景。

我尝试了以下方法 - 将非黑色单元格着色为绿色 - 没有成功:

data[data[:,:,:] > 0] = (0, 255, 0)

data[data[:,:,:] != (0,0,0)] = (0, 255, 0)

出现以下错误(在这两种情况下):

ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 8679 output values where the mask is true

如何选择 3d numpy 数组中的所有“黑色”单元格?

这应该不会太难,但我无法弄清楚,而且似乎还没有关于 S/O 的类似问题(但如果我错了,请告诉我)。

这是我想要的结果:将灰色蒙版(左)转换为 RGB 颜色蒙版(右)。

灰色面具 RGB蒙版

标签: pythonarraysimagenumpy

解决方案


利用:

replace_arr = np.array([[[100, 255, 100]]]).repeat(512, 0).repeat(512, 1)
mask = np.repeat(np.all(arr == 0, axis = -1)[:, :, np.newaxis], 3, axis = -1)
arr = np.where(mask, 0, replace_arr)

另一种方法:

创建一个mask(True/False)大小为 (512, 512) 的 2d,True 如果其中(i,j)任何一个arr[i, j, :]不等于 0 ,则为。
用于idx = np.argwhere(mask)获取与 中的True值相对应的索引mask,并将这些索引设置为 中的新值arr

mask = np.any(arr != 0, axis = -1)
idx = np.argwhere(mask)
arr[idx[:, 0], idx[:, 1], :] = [100, 255, 100]

推荐阅读