VLFeat在Matlab中的图像拼接

时间:2014-11-24 14:30:41

标签: sift homography vlfeat mosaic ransac

以下是在使用SIFT计算描述符的RANSAC pror计算Homography Matrix H之后形成两个图像的Mosaic的一段代码:

% --------------------------------------------------------------------
%                                                               Mosaic
% --------------------------------------------------------------------
box2 = [1  size(im2,2) size(im2,2)  1 ;
        1  1           size(im2,1)  size(im2,1) ;
        1  1           1            1 ] ;
box2_ = inv(H) * box2 ;
box2_(1,:) = box2_(1,:) ./ box2_(3,:) ;
box2_(2,:) = box2_(2,:) ./ box2_(3,:) ;
ur = min([1 box2_(1,:)]):max([size(im1,2) box2_(1,:)]) ;
vr = min([1 box2_(2,:)]):max([siize(im1,1) box2_(2,:)]) ;
[u,v] = meshgrid(ur,vr) ;
im1_ = vl_imwbackward(im2double(im1),u,v) ;
z_ = H(3,1) * u + H(3,2) * v + H(3,3) ;
u_ = (H(1,1) * u + H(1,2) * v + H(1,3)) ./ z_ ;
v_ = (H(2,1) * u + H(2,2) * v + H(2,3)) ./ z_ ;
im2_ = vl_imwbackward(im2double(im2),u_,v_) ;
mass = ~isnan(im1_) + ~isnan(im2_) ;
im1_(isnan(im1_)) = 0 ;
im2_(isnan(im2_)) = 0 ;
mosaic = (im1_ + im2_) ./ mass ;
figure(2) ; clf ;
imagesc(mosaic) ; axis image off ;
title('Mosaic') ;
if nargout == 0, clear mosaic ; end
end

现在我明白我们需要在使用计算机Homography拼接它们之前将图像扭曲一下? 那么,“box2”的定义背后的逻辑是什么,即为什么要考虑im2的第一维和第二维的大小?此外,质量的功能和后面的代码行是什么?

1 个答案:

答案 0 :(得分:1)

box2的内容只是第二幅图像的边界框(角坐标);然后box2_将此边界框转换为im1的坐标系 - 您可以在其中计算坐标范围(urvr)投影im2的位置转化后。

变量mass的目的只是表示每个像素覆盖的图像数量:如果给定像素中只有一个图像非空,则其mass(...) = 1且结果等于来自这个图片。如果两个图像都是非空的,mass(...) = 2会导致计算它们的平均值。