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中对你不起作用?你在这个问题中所做的完全没有遵循链接的建议。要么这个解决方案有效,要么我的有效,但除非你展示你所做的,否则很难说蚂蚁和你所做的。