图像拼接CVPR2013文章——APAP算法代码详解

APAP算法主要用于解决有视差的图像拼接问题,通过特征匹配、归一化、离群点滤除和图像对齐来实现无缝拼接。在代码实现中,首先使用vl_sift提取特征并进行暴力匹配,然后归一化点分布并使用Multi-GS去除异常匹配。接着,构建画布并计算全局投影矩阵,最后通过全局投影或APAP方法将图像投影到画布上进行融合。

1.简介

APAP是2013年CVPR的文章:As-Projective-As-Possible Image Stitching with Moving DLT
作者主页pdf+code
motivated:使用单一的全局投影矩阵,只能应对平面场景的图像拼接,对于有视差的图像拼接,结果会有鬼影(ghosting artefacts)。作者针对这一问题,提出了将img网格化,然后利用Moving DLT的获得每个网格的投影矩阵 H i H_i Hi

图1

从图1中可以看出,PAPA本质上是对网格进行变形然后进行无缝拼接,那么进一步的优化方向其实也可以转为如何控制或者说优化网格形状,实现更好的无缝拼接。

2代码详解

2.1 使用vl库提取特征

fprintf('  Keypoint detection and matching...');tic;
[ kp1,ds1 ] = vl_sift(single(rgb2gray(img1)),'PeakThresh', 10,'edgethresh',500);
[ kp2,ds2 ] = vl_sift(single(rgb2gray(img2)),'PeakThresh', 10,'edgethresh',500);
%%%%%%初始时设置PeakThresh为0,这个值越大产生的特征点越少
matches   = vl_ubcmatch(ds1,ds2);
fprintf('done (%fs)\n',toc);

这里 vl_sift函数进行特征点提取,vl_ubcmatch使用暴力匹配法。PeakThresh是检测的特征点的阈值,即只有显著性大于这个阈值的特征点才会被检测出来,PeakThresh越大,特征点数量越少。edgethresh用于抑制边缘响应。

2.2 归一化

% Normalise point distribution.
fprintf('  Normalising point distribution...');tic;
data_orig = [ kp1(1:2,matches(1,:)) ; ones(1,size(matches,2)) ; kp2(1:2,matches(2,:)) ; ones(1,size(matches,2)) ];
[ dat_norm_img1,T1 ] = normalise2dpts(data_orig(1:3,:));
[ dat_norm_img2,T2 ] = normalise2dpts(data_orig(4:6,:));
data_norm = [ dat_norm_img1 ; dat_norm_img2 ];
fprintf('done (%fs)\n',toc);

if size(img1,1) == size(img2,1)    
    % Show input images.
    fprintf('  Showing input images...');tic;
    figure;
    imshow([img1,img2]);
    title('Input images');
    fprintf('done (%fs)\n',toc);
end

2.3 离群点滤除

% Multi-GS
rng(0);
[ ~,res,~,~ ] = multigsSampling(100,data_norm,M,10);
con = sum(res<=thr);
[ ~, maxinx ] = max(con);
inliers = find(res(:,maxinx)<=thr);
%这里res每一列表示每个模型的残差,而M表示选择的模型的数量。100为限定最大迭代时间不要管。10为每个模型里包含的点的数量。

这里使用了一个RANSAC改进版本Multi-GS来进行离群点滤除,结果输出过滤后的内点。

对于multigsSampling(100,data_norm,M,10):
第一个参数100代表最大迭代时间,单位为10ms,这里100代表最大迭代时间为1s
第二个参数为归一化的输入数据
第三个参数为选择用于迭代的模型数量,原文中M=500
第四个参数为每个模型所选取的点的数量

Multi-GS选取10个点来拟合模型,利用模型计算每个匹配点的残差,原文设置了一个阈值thr=0.1,残差大于thre的匹配点记为1,统计含1最多的模型,即为所求模型,提取这个模型中残差小于thr的点作为内点。

Multi-GS原文:Accelerated Hypothesis Generation for Multi-Structure Data via Preference Analysis

2.4 构建画布

fitfn = 'homography_fit';
[ h,A,D1,D2 ] = feval(fitfn,data_norm(:,inliers));
Hg = T2\(reshape(h,3,3)*T1);

这里用matlab内置的homography_fit函数获得了Global homography
H g [ u 1 v 1 w 1 ] = [ u 2 v 2 w 2 ] H_g\begin{bmatrix} u_1 \\ v_1\\ w_1\\ \end{bmatrix} =\begin{bmatrix} u_2 \\ v_2\\ w_2\\ \end{bmatrix} Hg u1v1w1 = u2v2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大泽泽的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值