1

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

细节有点涉及,所以说正确的操作就足够了

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) 是变换图像中最小的非零坐标。

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

原始问题

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

我在 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);
4

1 回答 1

0

您可能需要校正图像的径向失真。我建议仔细阅读 Rick Szeliski 的《计算机视觉》一书,以详细了解该主题。

于 2013-11-30T18:42:45.330 回答