【问题标题】:How to select 'black' cells in a 3d numpy array?如何在 3d numpy 数组中选择“黑色”单元格?
【发布时间】:2021-07-05 03:58:39
【问题描述】:

我有一个形状为 (512, 512, 3) 的 NumPy 数组(即 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 颜色蒙版(右)。

【问题讨论】:

  • 试试np.where。 : 当值不全为零时,您想将第二个通道设置为 255?
  • 是的,虽然不一定是第二个通道:我想为数组中所有非黑色的单元格分配一个 RGB 颜色(绿色只是一个示例)(值为 [0,0 ,0])。

标签: python arrays image numpy


【解决方案1】:

用途:

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)

另一种方法:

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

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

【讨论】:

  • 此解决方案仅适用于更改一个颜色通道,但我想将 RGB 值(三元组)分配给非黑色的值(值为 [0,0,0] )。
  • 完美,这正是我的意思!我更喜欢第二种方法。您能否也对您所做的事情做一个简短的解释?
  • @Sytze 我已经添加了解释。
猜你喜欢
  • 2019-03-15
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多