图像配准实现(matlab篇)

godloveljw 2015-01-21 06:58:14
研究配准进两年的时间,有幸看到一个技术文档,做了一下的总结,如有不妥之处敬请大家谅解,多提出意见
废话不多说,书归正传!
这里主要讲解的是多模态或者说是多序列MRI图像配准。采用的图片是人体膝盖图。配准暂且分为五部
Step1. 下载图片
Step2. 初始配准(粗配准)
Step3. 提高配准精度
Step4. 利用初始条件提高配准精度配准
Step5. 结果满意不满意,你说了算
下面一一详细说明以上几个步骤!
一,下载图片
这里采用的图片是matlab子带的两张MR膝盖图,“knee1.dcm” 作为参考图像,"knee2.dcm"为浮动图像!


fixed = dicomread('knee1.dcm'); % 读参考图像fixed
moving = dicomread('knee2.dcm'); % 读浮动图像moving


可能接下来大家关注的问题就是这两幅图像到底有什么区别,这种区别又有多大的可视化程度,下面就为推荐两个比较好用的函数用于观测两幅图像的区别。

figure, imshowpair(moving, fixed, 'method');
title('Unregistered');


imshowpair函数就是指以成双成对的形式显示图片,其中一个重要的参数就是‘method’,他又4个选择
(1)‘falsecolor’ 字面意思理解就是伪彩色的意思了,其实就是把两幅图像的差异用色彩来表示,这个是默认的参数。
(2)‘blend’ 这是一种混合透明处理类型,技术文档的翻译是alpha blending,大家自己理解吧。
(3)‘diff’ 这是用灰度信息来表示亮度图像之间的差异,这是对应‘falsecolor’的一种方式。
(4)参数‘monotage’可以理解成‘蒙太奇’,这是一种视频剪辑的艺术手法,其实在这里我们理解成拼接的方法就可以了。
为什么在这里罗里吧嗦的说这么多的显示呢,大家知道"人靠衣装,美靠...."(就不多说了吧),总之就是一个好的视觉效果能给人以耳目一新的效果。

嗯嗯,这个就是蒙太奇的效果了,


这两个则分别是伪彩色,混合透明处理了,至于大家接受那个就要看自己的爱好了
说到了这里终于结束了这关没有意义的读图环节,请大家原谅我的无耻吧。

二,初始配准(粗配准)
初始配准就是大致的使图像对其,使其差别不要太明显,以方便下一步的精细配准环节。
函数imregconfig这在个环节可是主角,从名字上看就知道他要设置一些参数和方法了,其实他真正的作用是配置优化器和度量准则,

[optmizer, metric] = imregconfig(modality);

参数modality指定fixed image, moving image之间的关系,有两种选择‘monomodal’, 'multimodal'两种,分别质量两幅图像是单一模态还是多模态,根据需要自己选择。
返回的参数optimizer是用于优化度量准则的优化算法,这里有
registration.optimizer.RegularStepGradientDescent 或者 registration.optimizer.OnePlusOneEvolutionary两种可供选择。
输出参数metric则是注明了度量两幅图片相似度的方法,提供了均方误差(registration.metric.MeanSquares)和互信息(registration.metric.MattesMutualInformation)两种供选择。
当然大家也可以根据结构扩充这两个参数。
到这里优化器和度量准别就已将做好了,是不是简单到没朋友。

要上大菜了,配准代码

movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredDefault, fixed);
title('A: Default registration');


imregister函数根据取得的optimizer,metric参数对2D,3D参考图像做变换(transform)目的是fixed,moving image对其,大家关注到有一个参数‘affine’,他是指该变化是仿射变换,同样该参数还可以选为
‘translation’ (x,y)坐标平移变换,不牵涉到旋转个尺度变换
‘rigid’ 刚性变换(平移和旋转)
‘similarity’ 改变换包括了平移,旋转和尺度变换
‘affine’ 在similarity的基础上加入了shear(图像的剪辑)

该图片就是粗配准的结果了,大家可以在右上角看到明显的不重合现象。

三,提高配准精度
粗配准的结果一般情况下达不到实际应用的要求,为此很有必要进一步提高精度,如果有对精度要求不高的朋友看到这里就可以结束了。

disp('optimizer');
disp('metric');

这两条指令可以看到默认生成的优化器和度量函数参数,当然这里提高精度的途径就是通过修改这两个参数了!

在这里我们通过修改两个参数,观察对配准效果的改进:
(1)改变优化器的步长已达到对更加精细的变换。

optimizer.InitialRadius = optimizer.InitialRadius/3.5;
movingRegisteredAdjustedInitialRadius = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredAdjustedInitialRadius, fixed);
title('Adjusted InitialRadius');

把原步长缩小为原来的3.5倍,结果如下

貌似效果还是有点的啊,大家在看右上角的阴影好像不见了
(2)在(1)基础上改变最大迭代次数

optimizer.MaximumIterations = 300;
movingRegisteredAdjustedInitialRadius300 = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredAdjustedInitialRadius300, fixed);
title('B: Adjusted InitialRadius, MaximumIterations = 300, Adjusted InitialRadius.');

效果如下:正上的阴影好像也减小了


四,改变初始条件提高精度
这里的思想就像我们在做雕塑一样,假如我们要用石头雕一个人,首先我们可以大刀阔斧的把头部留出来,然后把脖子留的比头部更细,简单的说就是美女留出S轮廓,或者o型的(哈哈,对号入座就可以了),下一步精雕细琢的时候就会轻松很多,这里的初始条件就是先用简单的变换做出一个初始配准图像,然后以初始配准的结果作为输入做精细配准。
大致做法如下:
tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

用similarity的变换方式做初始配准,或者你还可以用rigid,transform的方式都可以
tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

在这里imregtform把变化矩阵输出;
然后用imref2d限制变换后的图像与参考图像有相同的坐标分布
Rfixed = imref2d(size(fixed));


imwarp函数执行几何变换,当然依据则是tformSimilarity的变换矩阵了。
movingRegisteredRigid = imwarp(moving,tformSimilarity,'OutputView',Rfixed);
figure, imshowpair(movingRegisteredRigid, fixed);
title('C: Registration based on similarity transformation model.');

得到的tformsimilarity.T就是传说中的变换矩阵了
tformSimilarity.T= 1.0331 -0.1110 0
0.1110 1.0331 0
-51.1491 6.9891 1.0000
下面就是精配准的部分了:

movingRegisteredAffineWithIC = imregister(moving,fixed,'affine',optimizer,metric,...
'InitialTransformation',tformSimilarity);
figure, imshowpair(movingRegisteredAffineWithIC,fixed);
title('D: Registration from affine model based on similarity initial condition.');

初始配准结果:
进一步精细配准:

五,到这里就是你说了算了Deciding When Enough is Enough

figure
imshowpair(movingRegisteredDefault, fixed)
title('A - Default settings.');

figure
imshowpair(movingRegisteredAdjustedInitialRadius, fixed)
title('B - Adjusted InitialRadius, 100 Iterations.');

figure
imshowpair(movingRegisteredAdjustedInitialRadius300, fixed)
title('C - Adjusted InitialRadius, 300 Iterations.');

figure
imshowpair(movingRegisteredAffineWithIC, fixed)
title('D - Registration from affine model based on similarity initial condition.');

选择一个合适的,理想的你想要的结果,去飞去装逼吧。
...全文
50977 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Francis7LC 2019-01-25
  • 打赏
  • 举报
回复
请问楼主能知道两幅图像配准之后的位移量吗?谢谢!
一月的晨曦 2019-01-14
  • 打赏
  • 举报
回复
引用 6 楼 qq_20867285 的回复:
这个适合视网膜眼底图像吗?这个代码是包括了特征检测的部分吗

请问您当时是做的视网膜眼底图像的特征提取吗?我现在也在做这个,预处理需要配准下吗
qq_18238763 2018-05-30
  • 打赏
  • 举报
回复
麻烦楼主看到回复我一下啊
qq_18238763 2018-05-30
  • 打赏
  • 举报
回复
你好 请问为什么换了图像就不行了 这两张膝盖图怎么获取
beyondliyi 2017-07-23
  • 打赏
  • 举报
回复
要是把图片格式换成jpg或者png的格式行么
hujingshuang 2017-06-20
  • 打赏
  • 举报
回复
引用 15 楼 qq_37318596 的回复:
为什么我永远在figure, imshowpair(moving, fixed, 'method'); 出错啊
看17樓代碼。
hujingshuang 2017-06-20
  • 打赏
  • 举报
回复
引用 16 楼 weixin_38629821 的回复:
未定义函数或变量 'optimizer'。 出错 Untitled2 (line 5) movingRegisteredDefault = imregister(I1,I, 'affine', optimizer, metric); 什么情况
看17樓代碼。
hujingshuang 2017-06-20
  • 打赏
  • 举报
回复
看到上面那麼多人在問,這裏我發一個簡單清晰版代碼,供參考。
clear;
close all;

fixed = dicomread('knee1.dcm');  	% 读参考图像fixed
moving = dicomread('knee2.dcm');    % 读浮动图像moving

figure;imshowpair(moving, fixed, 'montage');
figure;imshowpair(moving, fixed);

% 粗配准
[optimizer, metric] = imregconfig('multimodal'); % multimodal

movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric);
figure;imshowpair(movingRegisteredDefault, fixed);

% 調整參數
optimizer.InitialRadius = optimizer.InitialRadius / 5;
optimizer.MaximumIterations = 500;

% 變換矩陣
tformSimilarity = imregtform(moving, fixed, 'affine', optimizer, metric); % tformSimilarity.T

% 精配准
Rfixed = imref2d(size(fixed));

movingRegisteredRigid = imwarp(moving, tformSimilarity, 'OutputView', Rfixed);
figure;imshowpair(movingRegisteredRigid, fixed);
代碼中: movingRegisteredDefault:是粗配準後的浮動圖像,大小與參考圖像一致,超出的被切掉,不足的補零; movingRegisteredRigid:是精配準後的浮動圖像,同上; tformSimilarity.T:是透視變換矩陣; optimizer的參數可以根據情況自己調整。 大概就是這樣,至於關鍵函數使用的算法,目前還沒有去了解。
weixin_38629821 2017-05-03
  • 打赏
  • 举报
回复
未定义函数或变量 'optimizer'。 出错 Untitled2 (line 5) movingRegisteredDefault = imregister(I1,I, 'affine', optimizer, metric); 什么情况
qq_37318596 2017-04-25
  • 打赏
  • 举报
回复
为什么我永远在figure, imshowpair(moving, fixed, 'method'); 出错啊
keke156 2017-02-06
  • 打赏
  • 举报
回复
请问楼主,图像配准可以将两幅图像重叠在一起吗?重叠之后的两张图像还可以再分离出来吗?
alansss 2016-06-27
  • 打赏
  • 举报
回复
引用 11 楼 king_qyx 的回复:
http://cn.mathworks.com/help/images/ref/imregister.html 真相
楼主应该是翻译的这个: http://cn.mathworks.com/help/images/examples/registering-multimodal-mri-images.html?prodcode=IP&language=en 多谢楼主分享~
csmydn369 2015-12-13
  • 打赏
  • 举报
回复
能问下这个错误怎么解决吗? Undefined function 'imregtform' for input arguments of type 'registration.optimizer.OnePlusOneEvolutionary'.
king_qyx 2015-12-05
  • 打赏
  • 举报
回复
http://cn.mathworks.com/help/images/ref/imregister.html 真相
biaoguo819 2015-11-10
  • 打赏
  • 举报
回复
请教楼主,imregtform用的是什么算法,可否有论文?
lzy860928 2015-11-04
  • 打赏
  • 举报
回复
请教:多模态 / 多序列MRI图像, 或者只是T1/T2 加权的图像配准,用什么变换该怎么选择。。。
卡卡啊啊 2015-10-27
  • 打赏
  • 举报
回复
楼主太厉害了,我刚学配准,请问应当如何?
qq_20867285 2015-07-09
  • 打赏
  • 举报
回复
这个适合视网膜眼底图像吗?这个代码是包括了特征检测的部分吗
prfans1 2015-05-19
  • 打赏
  • 举报
回复
请教 imregister函数是matlab自带的吗?
我的2008版本没有,是版本太低?
沙漠三千年 2015-05-18
  • 打赏
  • 举报
回复
楼主有没有做过关于乳腺图像的配准啊?
加载更多回复(2)

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧