我需要在生成旋转矩阵的scipy.ndimage.interpolation.affine_transform 之后计算体积中的两个已知点的重映射坐标。
除了在affine_transform期间旋转外,输出数组也会与输入数组相比进行填充,以考虑旋转的体积可能超出原始数组形状范围的事实。
我有转换前的两个已知点的坐标转换(xb1,yb1,zb1)和(xb2,yb2,zb2)。我想知道这些坐标的 new 位置在仿射变换和数组扩展(xa1,ya1,za1)和&之后是什么。 (za2,ya2,za2)。 在affine_transform中,旋转在卷的中心(xb1,yb1,zb1)和(xb2,yb2,zb2)之间的中点处执行。
编辑: 到目前为止我尝试过的: 我制作了一个与我正在变形的体积相同形状的零阵列。对应于两个起始点的零数组中的两个元素被设置为两个32位整数,1000个用于一个,5000用于另一个。 然后我用与体积相同的变换矩阵变换标记的零数组,然后在样条顺序为0的affine_transform之后(为了保持变换数组中的起始元素值),我只使用np.any返回索引变换后的数组中的1000和5000个元素。这样可以正常工作,但有些情况下,在affine_transform的过程中,一个点可能会“丢失” - 可能通过样条顺序为0的插值(无样条曲线)。 所以这并不适用于所有情况。
答案 0 :(得分:0)
我让它以相当迂回的方式工作,从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,我得到了我的最终坐标。
我确定这可能是一种非常简单的方法,但这似乎对我有用。