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