4,446
社区成员
发帖
与我相关
我的任务
分享
fixed = dicomread('knee1.dcm'); % 读参考图像fixed
moving = dicomread('knee2.dcm'); % 读浮动图像moving
figure, imshowpair(moving, fixed, 'method');
title('Unregistered');
[optmizer, metric] = imregconfig(modality);
movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredDefault, fixed);
title('A: Default registration');
disp('optimizer');
disp('metric');
optimizer.InitialRadius = optimizer.InitialRadius/3.5;
movingRegisteredAdjustedInitialRadius = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredAdjustedInitialRadius, fixed);
title('Adjusted 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);
tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);
Rfixed = imref2d(size(fixed));
movingRegisteredRigid = imwarp(moving,tformSimilarity,'OutputView',Rfixed);
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.');
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.');
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的參數可以根據情況自己調整。
大概就是這樣,至於關鍵函數使用的算法,目前還沒有去了解。