更新:
我创建了一个有据可查的 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
但我更喜欢使用自定义转换矩阵。