计算scipy.ndimage.interpolation.affine_transform后体积内点的位置



在应用scipy.ndimage.interpolation.afine_transform和我生成的旋转矩阵后,我需要计算体积内两个已知点的重映射坐标。

除了在affine_transform期间被旋转之外,与输入阵列相比,输出阵列也被填充,以考虑到旋转的体积可能落在原始阵列形状的边界之外的事实。

我有体积中两个已知点在变换之前的坐标(xb1,yb1,zb1)和(xb2,yb2,zb2)。我想知道在阵列(xa1,ya1,za1)&(za2,ya2,za2)。在仿射变换中,在体积中心的(xb1,yb1,zb1)和(xb2,yb2,zb2)之间的中点处执行旋转。

编辑:到目前为止,我已经尝试过:我制作了一个0数组,其形状与我正在转换的体积相同。零数组中对应于两个起始点的两个元素被设置为两个32位整数,一个为1000,另一个为5000。然后,我用与体积相同的变换矩阵对标记的零数组进行变换,然后在用样条顺序为0的affine_transform(以保持变换数组中的起始元素值)之后,我只使用np.any返回变换数组中1000和5000个元素的索引。这可以正常工作,但在某些情况下,在affine_transform的过程中,一个点可能会"丢失"——可能是通过样条线顺序为0的插值(没有样条线)。所以这并不是在所有情况下都有效。

从kazemakase的第一个建议开始,我以一种相当迂回的方式让它发挥作用。

我首先计算原点p1和p2的旋转矩阵。这是用于阵列中体积变换的相同矩阵(将点向量pV=p2-p1移动到[0,1,0]使用旋转矩阵将矢量与轴对齐的不精确性

使用旋转矩阵,然后我用计算旋转点的位置

p1Dest = np.dot(p1, rotation_matrix.T)
p2Dest = np.dot(p2, rotation_matrix.T)

然后我确定p1Dest和p2Dest之间的中心坐标(我使用bresenham线计算,得到中值——http://code.activestate.com/recipes/578112-bresenhams-line-algorithm-in-n-dimensions/)。我称之为pDCenter。

然后,要将pdCenter移动到阵列的中心,我首先确定变换体积阵列的中心(我称之为cArrayT)。我用了一种巧妙的方法。

def centreOfArray(array):
centerList = []
for d in array.shape:
centerOfAxis = np.int(d/2.)
centerList.append(centerOfAxis)
return np.asarray(centerList)

使用两个中心,然后计算pTransl=pDCenter-cArrayT。然后从p1Dest和p2Dest中减去pTransl,我就得到了最终的坐标。

我确信可能有一种更简单的方法,但这似乎对我有效

最新更新