繁体   English   中英

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

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

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

RGB图像

现在我想计算面具的平均 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM