天天看點

醫學圖像配準實作代碼(matlab篇)

研究配準進兩年的時間,有幸看到一個技術文檔,做了一下的總結,如有不妥之處敬請大家諒解,多提出意見

廢話不多說,書歸正傳!

這裡主要講解的是多模态或者說是多序列MRI圖像配準。采用的圖檔是人體膝蓋圖。配準暫且分為五部

Step1. 下載下傳圖檔

Step2. 初始配準(粗配準)

Step3. 提高配準精度

Step4. 利用初始條件提高配準精度配準

Step5. 結果滿意不滿意,你說了算

下面一一詳細說明以上幾個步驟!

一,下載下傳圖檔

        這裡采用的圖檔是matlab子帶的兩張MR膝蓋圖,“knee1.dcm” 作為參考圖像,"knee2.dcm"為浮動圖像!

Plain Text code ?

1 2

fixed = dicomread('knee1.dcm');      % 讀參考圖像fixed

moving = dicomread('knee2.dcm'); %  讀浮動圖像moving

可能接下來大家關注的問題就是這兩幅圖像到底有什麼差別,這種差別又有多大的可視化程度,下面就為推薦兩個比較好用的函數用于觀測兩幅圖像的差別。

Plain Text code ?

1 2

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

title('Unregistered');

imshowpair函數就是指以成雙成對的形式顯示圖檔,其中一個重要的參數就是‘method’,他又4個選擇

(1)‘falsecolor’ 字面意思了解就是僞彩色的意思了,其實就是把兩幅圖像的差異用色彩來表示,這個是預設的參數。

(2)‘blend’ 這是一種混合透明處理類型,技術文檔的翻譯是alpha blending,大家自己了解吧。

(3)‘diff’ 這是用灰階資訊來表示亮度圖像之間的差異,這是對應‘falsecolor’的一種方式。

(4)參數‘monotage’可以了解成‘蒙太奇’,這是一種視訊剪輯的藝術手法,其實在這裡我們了解成拼接的方法就可以了。

為什麼在這裡羅裡吧嗦的說這麼多的顯示呢,大家知道"人靠衣裝,美靠...."(就不多說了吧),總之就是一個好的視覺效果能給人以耳目一新的效果。

醫學圖像配準實作代碼(matlab篇)

嗯嗯,這個就是蒙太奇的效果了,

醫學圖像配準實作代碼(matlab篇)
醫學圖像配準實作代碼(matlab篇)

這兩個則分别是僞彩色,混合透明處理了,至于大家接受那個就要看自己的愛好了

說到了這裡終于結束了這關沒有意義的讀圖環節,請大家原諒我的無恥吧。

二,初始配準(粗配準)

初始配準就是大緻的使圖像對其,使其差别不要太明顯,以友善下一步的精細配準環節。

函數imregconfig這在個環節可是主角,從名字上看就知道他要設定一些參數和方法了,其實他真正的作用是配置優化器和度量準則,

Plain Text code ?

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)兩種供選擇。

當然大家也可以根據結構擴充這兩個參數。

到這裡優化器和度量準别就已将做好了,是不是簡單到沒朋友。

要上大菜了,配準代碼

Plain Text code ?

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(圖像的剪輯)

醫學圖像配準實作代碼(matlab篇)

該圖檔就是粗配準的結果了,大家可以在右上角看到明顯的不重合現象。

三,提高配準精度

粗配準的結果一般情況下達不到實際應用的要求,為此很有必要進一步提高精度,如果有對精度要求不高的朋友看到這裡就可以結束了。

Plain Text code ?

1 2

disp('optimizer');

disp('metric');

這兩條指令可以看到預設生成的優化器和度量函數參數,當然這裡提高精度的途徑就是通過修改這兩個參數了!

醫學圖像配準實作代碼(matlab篇)

在這裡我們通過修改兩個參數,觀察對配準效果的改進:

(1)改變優化器的步長已達到對更加精細的變換。

Plain Text code ?

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倍,結果如下

醫學圖像配準實作代碼(matlab篇)

貌似效果還是有點的啊,大家在看右上角的陰影好像不見了

(2)在(1)基礎上改變最大疊代次數

Plain Text code ?

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.');

效果如下:正上的陰影好像也減小了

醫學圖像配準實作代碼(matlab篇)

四,改變初始條件提高精度

這裡的思想就像我們在做雕塑一樣,假如我們要用石頭雕一個人,首先我們可以大刀闊斧的把頭部留出來,然後把脖子留的比頭部更細,簡單的說就是美女留出S輪廓,或者o型的(哈哈,對号入座就可以了),下一步精雕細琢的時候就會輕松很多,這裡的初始條件就是先用簡單的變換做出一個初始配準圖像,然後以初始配準的結果作為輸入做精細配準。

大緻做法如下:

Plain Text code ?

1

tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

用similarity的變換方式做初始配準,或者你還可以用rigid,transform的方式都可以

Plain Text code ?

1

tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

在這裡imregtform把變化矩陣輸出;

然後用imref2d限制變換後的圖像與參考圖像有相同的坐标分布

Plain Text code ?

1

Rfixed = imref2d(size(fixed));

imwarp函數執行幾何變換,當然依據則是tformSimilarity的變換矩陣了。

Plain Text code ?

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

下面就是精配準的部分了:

Plain Text code ?

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.');

初始配準結果:

醫學圖像配準實作代碼(matlab篇)

進一步精細配準:

醫學圖像配準實作代碼(matlab篇)

五,到這裡就是你說了算了Deciding When Enough is Enough

Plain Text code ?

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.');

選擇一個合适的,理想的你想要的結果,去飛去裝逼吧。 更多0