是否可以在SPM中将任意变换矩阵应用于图像?

时间:2017-10-30 22:37:03

标签: matlab matrix nifti spm

我想在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变量输出,所以我可以多次对同一个图像进行输出,但这并不是明确必要的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

例如,您的图片是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_aff的底行是1,你可以忽略它。前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