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

时间:2020-03-03 15:32:02

标签: python arrays numpy numpy-slicing

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

RGB image

现在,我想计算蒙版(无黑色背景的芯棒)的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颜色计算?

1 个答案:

答案 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

相关问题