图像配准(Image Registration),是数字图像处理中非常关键的问题之一。
配准的本质是 将两个或多个图像进行对齐 以便进行比较、分析或融合的过程。
图像配准的目标是 找到一个变换矩阵(Transform matrix),将不同图像中的相应特征或点匹配在一起,以便它们在同一坐标系下对齐。
https://www.mathworks.com/help/medical-imaging/ug/medical-image-registration.html
图像配准大致可以分为两类:
1. 刚性配准(Rigid registration)
2.非刚性配准(Non-rigid registration)
刚性配准 包括以下几种类型,不同类型有不同的复杂度:
-
Translation registration(only translation)
-
Rigid registration (translation and rotation)
-
Similarity registration (translation, rotation, and scale)
-
Affine registration (translation, rotation, scale, and shear)
之前的关于ImageJ的文章,介绍了怎样利用ImageJ的插件来做图像配准:
也介绍了怎样 利用ANTs进行多模态配准:
这篇文章会演示怎样利用MATLAB,对3D血管数据图像进行配准:
配准后:
1、实例代码,MATLAB版本R2021b:
% This script shows how to registrate 3D stack using rigid registration
clear; close all;
imgTemp = imstackread('imgTemplate.tif');
imgReg = imstackread('imgRegistrate.tif');
imgTempMIP = max(imgTemp,[],3);
imgRegMIP = max(imgReg,[],3);
% Create the optimizer and metric
[optimizer, metric] = imregconfig('multimodal');
optimizer.MaximumIterations = 300;
optimizer.InitialRadius = 0.0009;
% get the transform matrix
tform = imregtform(imgRegMIP, imgTempMIP, 'affine', optimizer, metric);
% apply transform matrix
imgRegAffine = imwarp(imgRegMIP, tform,'OutputView',imref2d(size(imgRegMIP)));
figure(9);
subplot(1,2,1); imshowpair(imgRegMIP,imgTempMIP); title('Before registration');
subplot(1,2,2); imshowpair(imgRegAffine,imgTempMIP);title('After affine registration');
%% apply tranform matrix to all slices of the image stack
for ii = 1:size(imgReg,3)
imgReg(:,:,ii) = imwarp(imgReg(:,:,ii), tform,'OutputView',imref2d(size(imgRegMIP)));
disp(['Frame-',num2str(ii),' finished']);
end
imstackwrite(uint16(imgReg),'imgAfterReg.tif');
输出结果:
2、关键代码解析
(1)导入3D stack
imgTemp = imstackread('imgTemplate.tif');
imgReg = imstackread('imgRegistrate.tif');
imstackread 函数参考这篇文章:
(2)对 3D stack 进行 Max Intensity Projection(MIP)
imgTempMIP = max(imgTemp,[],3);
imgRegMIP = max(imgReg,[],3);
单层血管的特征比较少,单层与单层配准可能因为特征不足,导致配准失败。
MIP后的图包含了Z轴上的信息,有更多的特征,更容易得到好的配准结果:
(3)初始化配准参数
% Create the optimizer and metric
[optimizer, metric] = imregconfig('multimodal');
optimizer.MaximumIterations = 300;
optimizer.InitialRadius = 0.0009;
如果两个图像的采集条件不一样,例如用的不同的成像系统,或者信噪比差别较大。
这种情况需要进行多模态的配准,所以选择'multimodal'。
optimizer中具体的参数,参考:
https://www.mathworks.com/help/images/create-an-optimizer-and-metric-for-intensity-based-image-registration.html
这里需要关注 optimizer.MaximumIterations 这个参数,如果配准效果不好,可以适当提高iteration的数量,但计算速度会变慢。
(4)得到变换矩阵
% get the transform matrix
tform = imregtform(imgRegMIP, imgTempMIP, 'affine', optimizer, metric);
因为需要配准的图像和原始的图像模板相比,除了位移也有旋转、以及形状上的变形。
所以在配准时,选择 仿射变换(Affine)。
(5)根据变换矩阵对图像进行变换
% apply transform matrix
imgRegAffine = imwarp(imgRegMIP, tform,'OutputView',imref2d(size(imgRegMIP)));
得到变换矩阵后,可以通过imwarp对图像进行变换。
这里需要注意 定义变换后图像的大小,即'OutputView'。一般希望输出图像的大小和原始图像大小一致。
link