更新
我创建了一个记录良好的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
给定的矩阵和偏移用于查找中的每个点 通过仿射输出输入中的相应坐标 转型。这些坐标处的输入值是 通过所请求订单的样条插值确定。点 在输入的边界之外根据给定的内容填充 模式。
听起来很完美。
但使用非常棘手。 Here有人正在使用该代码来旋转图片。 他的旋转矩阵是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
但我更愿意使用自定义转换矩阵。
答案 0 :(得分:4)
我找到了另一种选择:map_coordinates
使用numpy可以生成坐标的网格网格,然后重新整形/堆叠它们以形成位置向量。转换这些向量并将其转换回网格网格坐标格式。最后,map_coordinates
解决了抽样问题。
我认为这是一个常见的问题,并创建了一个ipython笔记本,逐步解释了所有内容:
http://nbviewer.jupyter.org/gist/lhk/f05ee20b5a826e4c8b9bb3e528348688
还有一个问题:坐标的顺序很奇怪。您需要以不直观的方式重新排序网格网格。可能是我的代码中的错误。
请注意,这种坐标重新排序会影响转换的轴。 如果你想围绕x轴旋转某些东西,相应的矢量不是(1,0,0)而是(0,1,0),它真的很奇怪。
但它有效,我认为原则很明确。