Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用1D布尔数组从3D RGB图像中提取遮罩_Python_Arrays_Numpy_Numpy Slicing - Fatal编程技术网

Python 使用1D布尔数组从3D RGB图像中提取遮罩

Python 使用1D布尔数组从3D RGB图像中提取遮罩,python,arrays,numpy,numpy-slicing,Python,Arrays,Numpy,Numpy Slicing,我有一个3D图像,它是一个numpy形状阵列(1314489,3),如下所示: print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1))) >>124.57794089613752 现在我想计算遮罩的平均RGB颜色值(没有黑色背景的cob)。计算整个图像的RGB值很容易: print(np.mean(colormaskcutted, axis=(0, 1))) >>[186.18434633 88.891

我有一个3D图像,它是一个numpy形状阵列(1314489,3),如下所示:

print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752

现在我想计算遮罩的平均RGB颜色值(没有黑色背景的cob)。计算整个图像的RGB值很容易:

print(np.mean(colormaskcutted, axis=(0, 1)))
>>[186.18434633  88.89164511  46.32022921]
但现在我只想得到cob的平均RGB颜色值。我有一个一维布尔掩码 具有此形状的遮罩阵列,其中一个值对应于所有3个颜色通道值:(1314489)

我尝试对遮罩的图像阵列进行切片,如下所示:

print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752
但是对于RGB颜色,它只返回一个值,而不是3个值


如何为1D布尔遮罩过滤3D numpy图像,以便执行平均RGB颜色计算?

如果您的问题仅限于计算平均值,则不必对图像进行子集设置。你可以简单地做

np.sum(colormaskcutted*boolean[:,:,None],轴=(0,1))/np.sum(boolean)
另外,我已经尝试了索引,您可以修改您的原始方法,如下所示:

print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752
np.mean(colormaskcutted[boolean,:],axis=0)
p.p.S.无法抗拒一些基准测试。因此,求和方法采用
15.9s
(1000次迭代,如示例中的尺寸,旧计算机);高级索引方法稍长,为
17.7s
。但是,可以进一步优化求和。按照Mad物理学家的建议使用
count\u nonzero
,略微缩短了到达
15.3s
的时间。我们还可以使用
tensordot
跳过创建临时数组:

np.tensordot(colormaskcutted, boolean, axes = [[0,1], [0,1]])/np.count_nonzero(msk)  

这将时间缩短到
4.5s

第二种解决方案是正确的。“我认为你应该去掉第一个。”疯狂的物理学家,他们给出了相同的答案。第一个稍微快一点,使用tensordot(或einsum)可以使速度更快。第二个更一般,很公平。使用
np.count\u non zero
而不是
np.sum
对速度有何影响?谢谢,我对这两个选项都很满意!那真是太好了。