7

更新:

我创建了一个有据可查的 ipython 笔记本。如果您只想要代码,请查看第一个答案。

问题

我有一个 40x40x40 的灰度值。这需要旋转/移动/剪切。

这是一个有用的齐次变换集合:http ://www.lfd.uci.edu/~gohlke/code/transformations.py.html

我需要将体积中的每个体素都视为一对(位置向量,值)。然后,我将变换位置并从变换后的向量集中为每个坐标采样新值。

采样似乎相当困难,我很高兴发现: https ://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.ndimage.affine_transform.html#scipy.ndimage.affine_transform

给定的矩阵和偏移量用于通过仿射变换为输出中的每个点找到输入中的相应坐标。这些坐标处的输入值由请求顺序的样条插值确定。根据给定的模式填充输入边界之外的点。

听起来很完美。

但使用非常棘手。这里有人正在使用该代码来旋转图像。他的旋转矩阵是 2x2,所以不是齐次坐标。我尝试将齐次坐标(2D)中的平移矩阵传递给函数:

dim =10
arr=np.zeros((dim,dim))
arr[0,0]=1
mat=np.array([[1,0,1],[0,1,0],[0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)

这会产生错误:

Traceback (most recent call last):
  File "C:/Users/212590884/PycharmProjects/3DAugmentation/main.py", line 32, in <module>
    out3=scipy.ndimage.affine_transform(arr,mat)
  File "C:\Users\212590884\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\ndimage\interpolation.py", line 417, in affine_transform
    raise RuntimeError('affine matrix has wrong number of rows')
RuntimeError: affine matrix has wrong number of rows

显然这不适用于齐次坐标。如何使用它来转移数据?

这只是 2D,在 3D 中我什至无法旋转音量:

dim =10
arr=np.zeros((dim,dim,dim))
arr[0,0]=1

angle=10/180*np.pi
c=np.cos(angle)
s=np.sin(angle)
mat=np.array([[c,-s,0,0],[s,c,0,0],[0,0,1,0],[0,0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)

错误信息是一样的:affine matrix has wrong number of rows

是否可以使用这种方法来转换我的音量?

我找到了一组辅助方法,它们提供移位和旋转但不提供剪切: https ://docs.scipy.org/doc/scipy-0.14.0/reference/ndimage.html

但我更喜欢使用自定义转换矩阵。

4

1 回答 1

4

我找到了另一个选择:map_coordinates

使用 numpy 可以生成坐标网格,然后对它们进行整形/堆叠以形成位置向量。这些向量被转换并转换回网格坐标格式。最后用map_coordinates采样问题解决了。

我认为这是一个常见问题,并创建了一个 ipython 笔记本,它逐步解释了所有内容:

http://nbviewer.jupyter.org/gist/lhk/f05ee20b5a826e4c8b9bb3e528348688

还有一个问题:坐标的顺序很奇怪。您需要以不直观的方式重新排列网格网格。可能是我的代码中的错误。

请注意,这种坐标重新排序会影响转换的轴。如果要绕x轴旋转,对应的向量不是(1,0,0)而是(0,1,0),真的很奇怪。

但它有效,我认为原理很清楚。

于 2016-11-10T14:26:48.193 回答