我们从哪里得到位移场或控制点向量?

How to get displacement field or control point vector when we have tfrom?

我正在使用图像配准工具箱来配准两张 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' 是源 image.I 的传输图像,已检查它并且工作正常,但我现在需要此转换的控制点或位移场。换句话说,我需要知道每个体素(3d 像素)移动到哪个位置。如果我知道这一点,我就可以绘制矢量场。在NiftyReg package等可变形图像注册方法中,提供了控制点命令以方便用户使用,但我不知道如何在Matlab中使用简单的3d仿射来实现。 任何帮助将不胜感激

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

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

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

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

注意在deformable image registration领域,一般每个控制点都会有不同的tform(所以才叫deformable而不是rigid)

编辑:正如@Ashish Uthama 在评论中建议的那样,您也可以使用 Matlab 内置函数 transformpointsforward() 来完成。我将永远是 "writing your own code" 哲学的推动者,特别是第一次,所以你确实明白你在做什么。

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