如何实现图像间精确配准(matlab)
這里主要講解的是多模態(tài)或者說是多序列MRI圖像配準(zhǔn)。采用的圖片是人體膝蓋圖。配準(zhǔn)暫且分為五部分。
Step1.?下載圖片
Step2.?初始配準(zhǔn)(粗配準(zhǔn))
Step3.?提高配準(zhǔn)精度
Step4.?利用初始條件提高配準(zhǔn)精度配準(zhǔn)
Step5.?結(jié)果滿意不滿意,你說了算
下面一一詳細(xì)說明以上幾個(gè)步驟!
一,下載圖片
????????這里采用的圖片是matlab子帶的兩張MR膝蓋圖,“knee1.dcm”?作為參考圖像,"knee2.dcm"為浮動圖像!
| 1 2 | fixed?=?dicomread('knee1.dcm');??????%?讀參考圖像fixed moving?=?dicomread('knee2.dcm');?%??讀浮動圖像moving |
可能接下來大家關(guān)注的問題就是這兩幅圖像到底有什么區(qū)別,這種區(qū)別又有多大的可視化程度,下面就為推薦兩個(gè)比較好用的函數(shù)用于觀測兩幅圖像的區(qū)別。
| 1 2 | figure,?imshowpair(moving,?fixed,?'method'); title('Unregistered'); |
imshowpair函數(shù)就是指以成雙成對的形式顯示圖片,其中一個(gè)重要的參數(shù)就是‘method’,他又4個(gè)選擇
(1)‘falsecolor’?字面意思理解就是偽彩色的意思了,其實(shí)就是把兩幅圖像的差異用色彩來表示,這個(gè)是默認(rèn)的參數(shù)。
(2)‘blend’?這是一種混合透明處理類型,技術(shù)文檔的翻譯是alpha?blending,大家自己理解吧。
(3)‘diff’?這是用灰度信息來表示亮度圖像之間的差異,這是對應(yīng)‘falsecolor’的一種方式。
(4)參數(shù)‘monotage’可以理解成‘蒙太奇’,這是一種視頻剪輯的藝術(shù)手法,其實(shí)在這里我們理解成拼接的方法就可以了。
為什么在這里羅里吧嗦的說這么多的顯示呢,大家知道"人靠衣裝,美靠...."(就不多說了吧),總之就是一個(gè)好的視覺效果能給人以耳目一新的效果。
嗯嗯,這個(gè)就是蒙太奇的效果了,
這兩個(gè)則分別是偽彩色,混合透明處理了,至于大家接受那個(gè)就要看自己的愛好了
說到了這里終于結(jié)束了這關(guān)沒有意義的讀圖環(huán)節(jié),請大家原諒我的無恥吧。
二,初始配準(zhǔn)(粗配準(zhǔn))
初始配準(zhǔn)就是大致的使圖像對其,使其差別不要太明顯,以方便下一步的精細(xì)配準(zhǔn)環(huán)節(jié)。
函數(shù)imregconfig這在個(gè)環(huán)節(jié)可是主角,從名字上看就知道他要設(shè)置一些參數(shù)和方法了,其實(shí)他真正的作用是配置優(yōu)化器和度量準(zhǔn)則,
| 1 | [optmizer,?metric]?=?imregconfig(modality); |
參數(shù)modality指定fixed?image,?moving?image之間的關(guān)系,有兩種選擇‘monomodal’,?'multimodal'兩種,分別質(zhì)量兩幅圖像是單一模態(tài)還是多模態(tài),根據(jù)需要自己選擇。
返回的參數(shù)optimizer是用于優(yōu)化度量準(zhǔn)則的優(yōu)化算法,這里有
registration.optimizer.RegularStepGradientDescent?或者?registration.optimizer.OnePlusOneEvolutionary兩種可供選擇。
輸出參數(shù)metric則是注明了度量兩幅圖片相似度的方法,提供了均方誤差(registration.metric.MeanSquares)和互信息(registration.metric.MattesMutualInformation)兩種供選擇。
當(dāng)然大家也可以根據(jù)結(jié)構(gòu)擴(kuò)充這兩個(gè)參數(shù)。
到這里優(yōu)化器和度量準(zhǔn)別就已將做好了,是不是簡單到?jīng)]朋友。
要上大菜了,配準(zhǔn)代碼
| 1 2 3 | movingRegisteredDefault?=?imregister(moving,?fixed,?'affine',?optimizer,?metric); figure,?imshowpair(movingRegisteredDefault,?fixed); title('A:?Default?registration'); |
imregister函數(shù)根據(jù)取得的optimizer,metric參數(shù)對2D,3D參考圖像做變換(transform)目的是fixed,moving?image對其,大家關(guān)注到有一個(gè)參數(shù)‘a(chǎn)ffine’,他是指該變化是仿射變換,同樣該參數(shù)還可以選為
‘translation’?(x,y)坐標(biāo)平移變換,不牽涉到旋轉(zhuǎn)個(gè)尺度變換
‘rigid’?剛性變換(平移和旋轉(zhuǎn))
‘similarity’?改變換包括了平移,旋轉(zhuǎn)和尺度變換
‘a(chǎn)ffine’?在similarity的基礎(chǔ)上加入了shear(圖像的剪輯)
該圖片就是粗配準(zhǔn)的結(jié)果了,大家可以在右上角看到明顯的不重合現(xiàn)象。
三,提高配準(zhǔn)精度
粗配準(zhǔn)的結(jié)果一般情況下達(dá)不到實(shí)際應(yīng)用的要求,為此很有必要進(jìn)一步提高精度,如果有對精度要求不高的朋友看到這里就可以結(jié)束了。
| 1 2 | disp('optimizer'); disp('metric'); |
這兩條指令可以看到默認(rèn)生成的優(yōu)化器和度量函數(shù)參數(shù),當(dāng)然這里提高精度的途徑就是通過修改這兩個(gè)參數(shù)了!
在這里我們通過修改兩個(gè)參數(shù),觀察對配準(zhǔn)效果的改進(jìn):
(1)改變優(yōu)化器的步長已達(dá)到對更加精細(xì)的變換。
| 1 2 3 4 | optimizer.InitialRadius?=?optimizer.InitialRadius/3.5; movingRegisteredAdjustedInitialRadius?=?imregister(moving,?fixed,?'affine',?optimizer,?metric); figure,?imshowpair(movingRegisteredAdjustedInitialRadius,?fixed); title('Adjusted?InitialRadius'); |
把原步長縮小為原來的3.5倍,結(jié)果如下
貌似效果還是有點(diǎn)的啊,大家在看右上角的陰影好像不見了
(2)在(1)基礎(chǔ)上改變最大迭代次數(shù)
| 1 2 3 4 | optimizer.MaximumIterations?=?300; movingRegisteredAdjustedInitialRadius300?=?imregister(moving,?fixed,?'affine',?optimizer,?metric); figure,?imshowpair(movingRegisteredAdjustedInitialRadius300,?fixed); title('B:?Adjusted?InitialRadius,?MaximumIterations?=?300,?Adjusted?InitialRadius.'); |
效果如下:正上的陰影好像也減小了
四,改變初始條件提高精度
這里的思想就像我們在做雕塑一樣,假如我們要用石頭雕一個(gè)人,首先我們可以大刀闊斧的把頭部留出來,然后把脖子留的比頭部更細(xì),簡單的說就是美女留出S輪廓,或者o型的(哈哈,對號入座就可以了),下一步精雕細(xì)琢的時(shí)候就會輕松很多,這里的初始條件就是先用簡單的變換做出一個(gè)初始配準(zhǔn)圖像,然后以初始配準(zhǔn)的結(jié)果作為輸入做精細(xì)配準(zhǔn)。
大致做法如下:
| 1 | tformSimilarity?=?imregtform(moving,fixed,'similarity',optimizer,metric); |
用similarity的變換方式做初始配準(zhǔn),或者你還可以用rigid,transform的方式都可以
| 1 | tformSimilarity?=?imregtform(moving,fixed,'similarity',optimizer,metric); |
在這里imregtform把變化矩陣輸出;
然后用imref2d限制變換后的圖像與參考圖像有相同的坐標(biāo)分布
| 1 | Rfixed?=?imref2d(size(fixed)); |
imwarp函數(shù)執(zhí)行幾何變換,當(dāng)然依據(jù)則是tformSimilarity的變換矩陣了。
| 1 2 3 | 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
下面就是精配準(zhǔn)的部分了:
| 1 2 3 4 | movingRegisteredAffineWithIC?=?imregister(moving,fixed,'affine',optimizer,metric,... ????'InitialTransformation',tformSimilarity); figure,?imshowpair(movingRegisteredAffineWithIC,fixed); title('D:?Registration?from?affine?model?based?on?similarity?initial?condition.'); |
初始配準(zhǔn)結(jié)果:
進(jìn)一步精細(xì)配準(zhǔn):
五,到這里就是你說了算了Deciding?When?Enough?is?Enough
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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.'); |
選擇一個(gè)合適的,理想的你想要的結(jié)果。
下面就我自己的采集的圖像就將上面的分析整理成一套完整的代碼,如下:
%%%%%%%%%讀取兩幅圖片,并且比較兩者的不同%%%%%%%%%%%%%%%% moving=imread('175600000005.Tiff'); moving=moving(:,:,1);%要求是單通道圖像,fixed=imread('215600000005.Tiff'); fixed=fixed(:,:,1);figure,imshow(moving,[]); figure,imshowpair(moving,fixed,'falsecolor'); %figure,imshowpair(moving,fixed,'blend'); title('unregiistered'); [optimizer, metric] = imregconfig('multimodal');%參數(shù)modality指定fixed image, moving image之間的關(guān)系,有兩種選擇‘monomodal’, 'multimodal'兩種, %分別質(zhì)量兩幅圖像是單一模態(tài)還是多模態(tài)%%%%%%%%%%%%%粗配準(zhǔn)%%%%%%%%%%%%%%%%%%%%%%%%%%%5 movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric); %參數(shù)optimizer是用于優(yōu)化度量準(zhǔn)則的優(yōu)化算法,參數(shù)metric則是注明了度量兩幅圖片相似度的方法 %‘similarity’ 改變換包括了平移,旋轉(zhuǎn)和尺度變換,‘a(chǎn)ffine’ 在similarity的基礎(chǔ)上加入了shear(圖像的剪輯) figure, imshowpair(movingRegisteredDefault, fixed); title('A: Default registration');%%%%%%%%%%%%%%%%%精細(xì)配準(zhǔn)%%%%%%%%%%%%%%%%%%5 disp('optimizer'); disp('metric'); optimizer.InitialRadius = optimizer.InitialRadius/3.5;%改變優(yōu)化器的步長已達(dá)到對更加精細(xì)的變換 movingRegisteredAdjustedInitialRadius = imregister(moving, fixed, 'affine', optimizer, metric); figure, imshowpair(movingRegisteredAdjustedInitialRadius, fixed); title('Adjused InitialRadius');optimizer.MaximumIterations = 300;%在上面的基礎(chǔ)上改變最大迭代次數(shù) movingRegisteredAdjustedInitialRadius300 = imregister(moving, fixed, 'affine', optimizer, metric); figure, imshowpair(movingRegisteredAdjustedInitialRadius300, fixed); title('B: Adjusted InitialRadius, MaximumIterations = 300, Adjusted InitialRadius.');%%%%%%%%%%%%另一個(gè)方法:改變初始條件提高精度%%%%%%%%%%%%%%%%%%%tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);%用similarity的變換方式做初始配準(zhǔn),還可以用rigid,transform的方式 Rfixed = imref2d(size(fixed));%imregtform把變化矩陣輸出;然后用imref2d限制變換后的圖像與參考圖像有相同的坐標(biāo)分布 movingRegisteredRigid = imwarp(moving,tformSimilarity,'OutputView',Rfixed);%imwarp函數(shù)執(zhí)行幾何變換,依據(jù)則是tformSimilarity的變換矩陣。 figure, imshowpair(movingRegisteredRigid, fixed); title('C: Registration based on similarity transformation model.');%%%%%%%接下來精準(zhǔn)配準(zhǔn)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% movingRegisteredAffineWithIC = imregister(moving,fixed,'affine',optimizer,metric,...'InitialTransformation',tformSimilarity); figure, imshowpair(movingRegisteredAffineWithIC,fixed); title('D: Registration from affine model based on similarity initial condition.');%%%%%%%%%%%%%%%總結(jié)對比以上4中方法輸出結(jié)果,AC效果相當(dāng),BD效果相當(dāng),最精確配準(zhǔn)%%%%%%%%%%% % 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.');?
總結(jié)
以上是生活随笔為你收集整理的如何实现图像间精确配准(matlab)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机桌面软件打不开,电脑桌面后的软件都
- 下一篇: 更换故障POE交换机