以下是在使用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的第一维和第二维的大小?此外,质量的功能和后面的代码行是什么?
答案 0 :(得分:1)
box2
的内容只是第二幅图像的边界框(角坐标);然后box2_
将此边界框转换为im1
的坐标系 - 您可以在其中计算坐标范围(ur
和vr
)投影im2
的位置转化后。
变量mass
的目的只是表示每个像素覆盖的图像数量:如果给定像素中只有一个图像非空,则其mass(...)
= 1且结果等于来自这个图片。如果两个图像都是非空的,mass(...)
= 2会导致计算它们的平均值。