使用一维布尔数组从 3D RGB 图像中提取掩码

Extract mask from 3D RGB image using a 1D Boolean array

我有一个 3D 图像,它是一个形状为 (1314, 489, 3) 的 numpy 数组,看起来如下:

现在我想计算蒙版(没有黑色背景的玉米棒)的平均 RGB 颜色值。计算整个图像的 RGB 值很容易:

print(np.mean(colormaskcutted, axis=(0, 1)))
>>[186.18434633  88.89164511  46.32022921]

但现在我只想要 cob 的平均 RGB 颜色值。我有一个一维布尔掩码 具有此形状的蒙版数组,其中一个值对应所有 3 个颜色通道值:(1314, 489)

我尝试对蒙版的图像数组进行切片,如下所示:

print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752

但是这只返回了一个值而不是 RGB 颜色的 3 个值。

如何为 1D 布尔蒙版过滤 3D numpy 图像,以便执行平均 RGB 颜色计算?

如果您的问题仅限于计算平均值,则不一定需要对图像进行子集化。你可以简单地做,例如

np.sum(colormaskcutted*boolean[:,:,None], axis = (0,1))/np.sum(boolean)

P.S。我玩过索引,你可以修改你原来的方法如下:

np.mean(colormaskcutted[boolean,:], axis = 0)

P.P.S。无法抗拒一些基准测试。因此,求和方法采用 15.9s(1000 次迭代,如示例中的维度,旧计算机);高级索引方法稍微长一些,在 17.7s。然而,可以进一步优化求和。根据 Mad Physicist 的建议使用 count_nonzero 将时间略微缩短至 15.3s。我们也可以使用 tensordot 跳过创建临时数组:

np.tensordot(colormaskcutted, boolean, axes = [[0,1], [0,1]])/np.count_nonzero(msk)  

这将时间缩短到 4.5s