图像局部配准、变形配准 最早是医学图像处理、图像拼接领域研究较多的topic,相比全局配准,其能将非刚性(局部刚性)的变换更好配准。这篇博客主要介绍变形配准的一些常用方法。
一、APAP
论文:As-Projective-As-Possible Image Stitching with Moving DLT
项目主页:https://cs.adelaide.edu.au/~tjchin/apap/
著名的APAP算法,(2013CVPR,2014TPAMI),是变形配准领域重要的论文,从论文的标题可以看出,APAP的思想是尽量让局部配准的结果接近Projective的结果。而估计H的方法,常用方法是DLT(直接线形变换),DLT推导比较简单,可以看作是优化:
Ah=b
论文中的Moving DLT则是给DLT加了一个权重w, w是和位置相关的,越靠近local 点的地方,权重越高:
wAh=b
这个w具体是怎么计算得到的呢,实际上就是根据高斯距离权重计算得到,下面公式中 x* 为 local的中心,如果xi越接近local的中心,那么权重越高,下面公式中的a,和global DLT时候A一样都是所有点坐标位置计算得到的A矩阵:

问题最终点成一个 WSVD 问题:

我们看下MDLT的主要代码,应该还是很好理解的:
%-------------------------
% Moving DLT (projective).
%-------------------------
fprintf('As-Projective-As-Possible Moving DLT on inliers\n');
% Image keypoints coordinates.
Kp = [data_orig(1,inliers)' data_orig(2,inliers)'];
% Generating mesh for MDLT.
fprintf('> Generating mesh for MDLT...');tic;
[ X,Y ] = meshgrid(linspace(1,cw,C1),linspace(1,ch,C2));
fprintf('done (%fs)\n',toc);
% Mesh (cells) vertices' coordinates.
Mv = [X(:)-off(1), Y(:)-off(2)];
% Perform Moving DLT
fprintf(' Moving DLT main loop...');tic;
Hmdlt = zeros(size(Mv,1),9);
parfor i=1:size(Mv,1)
% Obtain kernel
Gki = exp(-pdist2(Mv(i,:),Kp)./sigma^2);
% Capping/offsetting kernel
Wi = max(gamma,Gki);
% This function receives W and A and obtains the least significant
% right singular vector of W*A by means of SVD on WA (Weighted SVD).
v = wsvd(Wi,A);
h = reshape(v,3,3)';
% De-condition
h = D2\h*D1;
% De-normalize
h = T2\h*T1;
Hmdlt(i,:) = h(:);
end
fprintf('done (%fs)\n',toc);