Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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 三维阵列的裁剪面积_Python_Numpy - Fatal编程技术网

Python 三维阵列的裁剪面积

Python 三维阵列的裁剪面积,python,numpy,Python,Numpy,我有一个形状为(400512、512)的3D numpy数组,还有一个边界框,例如: [376, 250, 206] [380, 256, 211] ix = np.arange(*c[:, 0]).reshape(-1, 1, 1) iy = np.arange(*c[:, 1]).reshape(-1, 1) iz = np.arange(*c[:, 2]) a[ix, iy, iz] 现在,我想从数组中裁剪边界框区域并可视化。通常,在2D阵列/图像中,我们可以使用最小-最大值进行裁剪

我有一个形状为
(400512、512)
的3D numpy数组,还有一个边界框,例如:

[376, 250, 206]
[380, 256, 211] 
ix = np.arange(*c[:, 0]).reshape(-1, 1, 1)
iy = np.arange(*c[:, 1]).reshape(-1, 1)
iz = np.arange(*c[:, 2])
a[ix, iy, iz]
现在,我想从数组中裁剪边界框区域并可视化。通常,在2D阵列/图像中,我们可以使用最小-最大值进行裁剪,如:

img[y:y + h, x:x + w]
但我不认为在3D阵列中是这样的,因为z轴也包括在内。有人能举个例子说明如何使用最小-最大边界框坐标从三维numpy阵列裁剪区域吗?最后,我将在提取的边界框区域中拟合圆柱体

编辑:我希望所有索引及其强度值位于主大3D阵列的边界框内。 我可以这样做:

big_3d_array[z1:z2, x1:x2, y1:y2]
where,    
z1 = 376, z2 = 380, x1 = 250, x2 = 256, y1=206, y2= 211

现在这种方法的问题是,我只能得到强度值,不能得到指数。此外,我不确定是否使用此方法获取边界框内的所有坐标。因为在三维空间中,边界框应该有8个角点。这里我只有边界框的最小-最大值。

假设边界框数组由每个维度的三列组成,行是起始坐标和结束坐标,顺序如下:

c = np.array([[376, 250, 206]
              [380, 256, 211]])
让我们看一看3D中的:

您可以这样编写索引:

a[376:380, 250:256, 206:211]
此索引表示对
a.\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(实际上是
类型(a)。\uuuuuuuuuu getitem\u

a.__getitem__((slice(376, 380), slice(250, 256), slice(206, 211)))
使用此信息,您可以通过两种不同的方式为阵列编制索引:

a[c[0, 0]:c[1, 0], c[0, 1]:c[1, 1], c[0, 2]:c[1, 2]]
a[tuple(slice(*x) for x in c.T)]
第二种方法通常更具可伸缩性

Numpy提供了除切片之外的另一种索引数组的方法,称为。在该方法中,您提供了坐标数组,这些坐标组合成您想要的输出形状。例如:

[376, 250, 206]
[380, 256, 211] 
ix = np.arange(*c[:, 0]).reshape(-1, 1, 1)
iy = np.arange(*c[:, 1]).reshape(-1, 1)
iz = np.arange(*c[:, 2])
a[ix, iy, iz]
有一个名为的辅助对象,它可以让您更无缝地创建索引数组:

np.ogrid[tuple(slice(*x) for x in c.T)]
在所有情况下,如果您的边界框包含在上限上,则在索引中使用之前,您需要增加它:

c[1, :] += 1

img[y:y+h,x:x+w,:]为什么不选择答案?谢谢@MadPhysicast。当我第一次阅读时,它看起来很好。你的答案是正确的。但我看起来是这样的:使用bbox的最小-最大坐标从bbox内的3d阵列获取所有点。可能是你的答案起了作用。我可能误解了。你真的需要把问题弄清楚那么,bbox是在数组索引中,还是在数据的x-y-z坐标中?请提供一个有意义的例子,说明你想要什么?为什么链接在3D中对你不起作用?你在这个问题中所做的完全没有遵循链接的建议。要么这个解决方案有效,要么我的有效,但除非你展示你所做的,否则很难说蚂蚁和你所做的。