全景拼接的几张图片之间的同形图

时间:2013-11-30 17:50:29

标签: matlab image-processing panoramas

我发现了问题所在。我的解决方案是我从头顶开始的。当我坐下来详细计算时,我发现了两个错误。有一个错误和一个相当微妙的错误。

细节是涉及的,所以足以说正确的操作是

T=[1 0 0; 0 1 0; 1-x(1) 1-y(1) 1]; 
H(:,:,i+1)=H(:,:,i)*T*H2*H1^-1*T^-1;

其中x(1)和y(1)是变换图像中最小的非零坐标。

如果有人对细节感兴趣,我可以提供它们。

原始问题

这不是一个真正的编程问题,但我不知道一个更好的地方要问,因为我还没有找到任何图像处理Q& A个地方

我在matlab中有方法[H1,H2] = findHomographies(I1,I2,size(I1));发现单应性H1和H2,使得H1 * I1(应用H1至I1)和H2 * I2在相应的关注点重叠(或多或少)。据我所知,它运作良好。

现在,如果我想拼接超过2张图像,我想保留第一张图像,将H'= H2 * H1 ^ -1应用于第二张图像,然后为了找到单应性H ''对于第三张图像,我首先将H'应用于第二张和第三张图像,对其执行findHomographies,然后找到该对图像的H1'和H2'。然后第三个单应性是H''= H2'* H1'^ - 1 * H'。我这样做的原因是它应该消除,或者至少减少错误传播。

然而,在实践中它似乎不能很好地工作,如下图所示

http://i.stack.imgur.com/EAg9r.jpg

正如你所看到的,两个第一个图像拼接在一起很好,但在第二个和第三个之间,有一个非常明显的偏移。

有人知道我在这里做错了吗?

相关代码如下:

c=1
for i=1:c
    H(:,:,i)=eye(3);
end
corners=[1 1 imsize(2) imsize(2); 1 imsize(1) 1 imsize(1)];
for i=c:(n-1)
    cornersT=applyTrans(H(:,:,i)',corners);
    tform = projective2d(H(:,:,i));
    x=minmax(cornersT(1,:));
    y=minmax(cornersT(2,:));
    I1=imwarp(I(:,gi(i,s2),:), tform, 'OutputView', imref2d(imsize,[x(1) x(2)],[y(1) y(2)]));
    I2=imwarp(I(:,gi(i+1,s2),:), tform, 'OutputView', imref2d(imsize,[x(1) x(2)],[y(1) y(2)]));    
    [H1,H2]=findHomographies(I1,I2,size(I1));
    H(:,:,i+1)=H2*H1^-1*H(:,:,i);
end
corners=[1 1 imsize(2) imsize(2); 1 imsize(1) 1 imsize(1)];
cornersT=applyTrans(H(:,:,1)',corners);
for i=2:n
    cornersT=[cornersT applyTrans(H(:,:,i)',corners)];
end
x=minmax(cornersT(1,:));
y=minmax(cornersT(2,:));
tform = projective2d(H(:,:,1));
IRect=imwarp(I(:,gi(1,s2),:), tform, 'OutputView', imref2d(imsize,[x(1) x(2)],[y(1) y(2)]));
for i=2:n
    tform = projective2d(H(:,:,i));
    IRect2 = imwarp(I(:,gi(i,s2),:), tform, 'OutputView', imref2d(imsize,[x(1) x(2)],[y(1) y(2)]));
    IRect=imagestitch(IRect,IRect2);
end
figure; imshow(IRect);

1 个答案:

答案 0 :(得分:0)

您可能需要更正图像以获得径向扭曲。我建议您仔细查看Rick Szeliski的书“计算机视觉”,了解该主题的详细信息。