2

我正在使用图像注册工具箱来注册两个 3D 图像。我将运动图像注册到固定图像。我使用“imregtform”来保存 tform。

tform = imregtform(moving,fixed,transformType,optimizer,metric)

例如,这是我的“tform”:

    1.0235    0.0022   -0.0607         0
   -0.0276    1.0002    0.0089         0
   -0.0170   -0.0141    1.1685         0
   12.8777    5.0311  -70.0325    1.0000

然后我使用“Imwarp”将运动图像转换为固定图像。在我的代码中,

nii=load_untouch_nii(['mypath image.nii' ]);
I = nii.img; 
dii=nii.hdr.dime.pixdim(2:4);
Rfixed=imref3d(size(I),dii(2),dii(1),dii(3)); 
timg= imwarp(I, Rfixed, tform, 'OutputView', Rfixed);

'timg' 是源图像的传输图像。我检查了它,它工作正常,但我现在需要这个变换的控制点或位移场。换句话说,我需要知道每个体素(3d 像素)移动到哪个位置。如果我知道这一点,我可以绘制矢量场。在NiftyReg 包等可变形图像注册方法中,提供了控制点命令以方便用户使用,但我不知道如何在 Matlab 中的简单 3d 仿射中做到这一点。任何帮助将不胜感激

4

1 回答 1

3

您可以非常轻松地将几何变换应用于单个点。

您只需要将您的观点定义为p=[x;y;z;1]

然后pt通过pt=p*tform; pt=pt(1:3)./pt(4);(搜索齐次坐标以解释最后一个划分)获得。这就是imwarp在里面做的。它对每个像素执行上述乘法p

然后要获得位移,您只需要disp=pt-p;. 请注意,位移很可能不是整数。

请注意,在可变形图像配准领域,通常每个控制点都会有不同tform的控制点(这就是为什么它被称为可变形而不是刚性的原因)

编辑:正如@Ashish Uthama 在评论中建议的那样,您也可以使用 Matlab 内置函数来做到这一点transformpointsforward()。我将永远是“编写自己的代码”理念的推动者,特别是第一次,所以你确实明白你在做什么。

http://uk.mathworks.com/help/images/ref/affine3d.transformpointsforward.html

于 2015-05-14T15:06:28.723 回答