使用一维布尔数组从 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
。
我有一个 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
。