【问题标题】:calculate position of points within a volume after scipy.ndimage.interpolation.affine_transform在 scipy.ndimage.interpolation.affine_transform 之后计算体积内点的位置
【发布时间】:2018-04-12 01:55:35
【问题描述】:

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

除了在 affine_transform 期间进行旋转之外,输出数组还相对于输入数组进行了填充,以考虑到旋转后的体积可能超出原始数组形状的范围。

我有体积之前变换(xb1,yb1,zb1)和(xb2,yb2,zb2)中两个已知点的坐标。我想知道在仿射变换和扩展数组 (xa1,ya1,za1) & (za2, ya2, za2) 之后这些坐标的 位置是什么。 在 affine_transform 中,旋转是在体积中心 (xb1,yb1,zb1) 和 (xb2,yb2,zb2) 之间的中点进行的。

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

【问题讨论】:

  • 使用旋转矩阵变换点。
  • 感谢 kazemakase,这很有用,但旋转枢轴是初始起点和终点之间的中心点(这不是卷所在阵列的中心)。 affine_transform 还将轴心点重新映射到数组中心。也许我可以将变换应用于stackoverflow.com/questions/12148351/… 之类的起点和终点,然后计算将枢轴点移动到数组中心所需的平移,并对起点和终点应用相同的平移。这可能有效。

标签: python numpy scipy affinetransform


【解决方案1】:

根据 kazemakase 的第一个建议,我已经以一种相当迂回的方式工作了。

我首先计算初始点 p1 和 p2 的旋转矩阵。这是用于转换数组中的体积的相同矩阵(将点向量 pV = p2-p1 移动到 [0,1,0]。我使用以下修改的代码进行了此操作: Imprecision with rotation matrix to align a vector to an axis

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

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)。 我使用了一种 hacky 方法。

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,就得到了我的最终坐标。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2016-06-28
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多