[英]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]
但是现在我只想要棒子的平均 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)
PS我玩过索引,你可以修改你的原始方法如下:
np.mean(colormaskcutted[boolean,:], axis = 0)
PPS 无法抗拒某些基准测试。 因此,求和方法需要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
秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.