图像变形配准

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

发表评论