我有一个3D图像,它是一个形状为numpy的数组(1314、489、3),看起来如下:
现在,我想计算蒙版(无黑色背景的芯棒)的RGB平均颜色值。计算整个图像的RGB值很容易:
print(np.mean(colormaskcutted, axis=(0, 1)))
>>[186.18434633 88.89164511 46.32022921]
但是现在我只希望碳棒的平均RGB颜色值。我有一个一维布尔面罩 具有此形状的蒙版的数组,其中一个值对应于所有三个颜色通道值:(1314,489)
我尝试将图像数组切片为遮罩,如下所示:
print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752
但是此方法仅返回一个值,而不是RGB颜色的3个值。
如何过滤1D布尔蒙版的3D numpy图像,以便可以执行平均RGB颜色计算?
答案 0 :(得分:2)
如果您的问题仅限于计算均值,则不必子集图像。您可以简单地做到,例如
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
。