是否可以将任意变换矩阵应用于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变量,这样我就可以对同一个图像多次执行此操作,但这并不是明确必要的。

谢谢你的帮助。

仿射矩阵作用于图像坐标,而不是图像本身。你需要将仿射矩阵与图像的坐标列表相乘,然后你会得到新的坐标,对应于原始坐标。此外,平移是通过将仿射矩阵的第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

相关内容

  • 没有找到相关文章

最新更新