我们从哪里得到位移场或控制点向量?
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
我正在使用图像配准工具箱来配准两张 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