图像局部配准、变形配准 最早是医学图像处理、图像拼接领域研究较多的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);