我想在SPM中做一些特定的任务。
基本上,我有一些输入NII文件scan.nii
,我想对它进行任意仿射变换,由x y z p r yw
定义。
x,y,z,p,r,yw
代表每个自由度的翻译和轮换(例如x=2mm
,p=0.7deg
等等。我可以使用M=spm_matrix([x y z p r yw])
得到一个合适的矩阵,但我不知道如何将这个矩阵应用到我的扫描中。
理想情况下,我希望它输出一个新的文件名或简单地作为一个Matlab变量输出,所以我可以多次对同一个图像进行输出,但这并不是明确必要的。
感谢您的帮助。
答案 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