使用numpy / scipy转换和重新采样3D卷

时间:2016-11-10 09:51:59

标签: python numpy scipy geometry-shader ndimage

更新

我创建了一个记录良好的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

但我更愿意使用自定义转换矩阵。

1 个答案:

答案 0 :(得分:4)

我找到了另一种选择:map_coordinates

使用numpy可以生成坐标的网格网格,然后重新整形/堆叠它们以形成位置向量。转换这些向量并将其转换回网格网格坐标格式。最后,map_coordinates解决了抽样问题。

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

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

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

请注意,这种坐标重新排序会影响转换的轴。 如果你想围绕x轴旋转某些东西,相应的矢量不是(1,0,0)而是(0,1,0),它真的很奇怪。

但它有效,我认为原则很明确。