0

我想在 SPM 中完成一项有点具体的任务。

基本上,我有一些输入 NII 文件scan.nii,我想对其应用任意仿射变换,由x y z p r yw.

x,y,z,p,r,yw表示每个自由度的平移和旋转(比如x=2mmp=0.7deg等等)。我可以得到一个合适的矩阵M=spm_matrix([x y z p r yw]),但我不知道如何才能将这个矩阵实际应用到我的扫描中。

理想情况下,我希望它使用新文件名或简单地作为 Matlab 变量输出,这样我就可以对同一个图像多次执行此操作,但这不是明确必要的。

谢谢您的帮助。

4

1 回答 1

0

仿射矩阵适用于图像坐标,而不是图像本身。您需要将仿射矩阵与图像的坐标列表相乘,然后您将得到新的坐标,对应于原始坐标。此外,转换是通过将仿射矩阵的第 4 列与1索引列表最后一行中的附加 ' 相乘来完成的(这些中的每个匹配,在该矩阵的单个向量乘法处)。

因此,您需要生成一个 3D 坐标列表,作为 3xn 矩阵,然后1在底部添加一行 ',并将 4x4 仿射矩阵乘以 4xn 坐标矩阵。

例如,假设您的图像是 4x4x4:

[X Y Z]=ndgrid(1:4);
ind=reshape(cat(3,X,Y,Z),[],3)';  % list of all of the indices in the image
ind=[ind; ones(1,size(ind,2))];   % add a row of `1`s
ind_aff=m*ind;

最下面一行ind_aff1's,你可以忽略它。前 3 行现在是新坐标,而每一列都是与ind矩阵中由相同列号协调的值的坐标。

例如,如果

m=spm_matrix([3 1 10 0.5 0.9 0.3])

你会得到这样的转变:

% old coordinates (column-wise)
ind(1:3,1:3)=

     1     2     3
     1     1     1
     1     1     1

% new coordinates (column-wise)
ind_aff(1:3,1:3)=

    4.5609    5.1547    5.7486
    1.4073    0.7892    0.1711
    9.3693    8.8542    8.3392
于 2017-10-31T08:32:38.403 回答