我有一项特定的任务想在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变量,这样我就可以对同一个图像多次执行此操作,但这并不是明确必要的。
谢谢你的帮助。
仿射矩阵作用于图像坐标,而不是图像本身。你需要将仿射矩阵与图像的坐标列表相乘,然后你会得到新的坐标,对应于原始坐标。此外,平移是通过将仿射矩阵的第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_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