更新:
我创建了一个有良好文档的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)
错误信息是相同的:
仿射矩阵行数有误
可以使用这种方法来转换我的体积吗?我找到了一组辅助方法,它们提供了移位和旋转,但没有剪切: https://docs.scipy.org/doc/scipy-0.14.0/reference/ndimage.html 但我更喜欢使用自定义变换矩阵。