将2D切片合并到python中的3D体积

时间:2015-06-12 11:45:30

标签: python arrays numpy

似乎是一个相当简单的问题,但实际上并不那么容易,没有图像处理/处理方面的经验。

我不仅希望将2D数组叠加在一起,而是通过合并多个由空格分隔的二进制2D切片来创建3D体积。

例:
用零定义3D矩阵:

A = np.zeros((100,100,100))

A的第一个切片中放置一个矩形区域:

A[0,25:75,25:75] = 1

A的最后一个切片中间的值设置为1:

A[99,50,50] = 1

我现在如何线性合并这两个切片,以便结果是3D体积内的一个“金字塔”。

提前感谢您提出任何建议。

编辑:目的是通过在多个切片中定义多个感兴趣的2D区域来选择不同的感兴趣体积。想象一下,例如在切片0中定义一个大圆圈,在切片50中定义一个小圆圈,再在切片100中定义一个更大的圆圈。产生的感兴趣的体积应该是“沙漏结构”。

2 个答案:

答案 0 :(得分:0)

您应该评估第一个切片处的每个点与最后一个切点处的每个点之间的距离和角度,对于每个步骤,您应该以恒定角度线性减小距离。

A = np.zeros((100,100,100))
A[0,25:75,25:75] = 1
A[99,50,50] = 1

from math import sin, cos, atan2
dim = 100
for i99,j99 in np.swapaxes(np.where(A[dim-1]==1),0,1):
    for i0,j0 in np.swapaxes(np.where(A[0]==1),0,1):
        di = (i0-i99)
        dj = (j0-j99)
        dist = (di**2 + dj**2)**0.5
        ang = atan2(dj,di)
        for t in range(1,dim-1):
            ndist = dist * (1 - t/dim)
            pi = round(sin(ang)*ndist) + i99
            pj = round(cos(ang)*ndist) + j99
            A[t][pi][pj] = 1

现在我们应该检查我们的代码

在[2]中:

A[96][48:53,48:53]

出[2]:

array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

答案 1 :(得分:0)

我不认为你正在融合'事情,只需将A的连续层设置为不同的值。让我们通过使用一个小的2d数组来简化问题。我们可以用一小时的玻璃杯填充它。用这些简单的陈述:

A=np.zeros((10,11),int)    
for i in range(0,5):
    j=i+1
    A[i, j:-j] = i
for i in range(5,10):
    j=10-i
    A[i, j:-j]=i
制造

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0],
       [0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0],
       [0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0],
       [0, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0],
       [0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0]])

将其概括为3d,以及其他选择切片的方法应该是直截了当的。

A=np.zeros((10,11,11),int)
for i in range(0,5):
    j=i+1
    A[i, j:-j, j:-j] = i

设置一个圆而不是一个正方形需要更多代码,但这是另一个问题,不是吗?