我发现了问题所在。我的解决方案是我从头顶想到的。当我坐下来详细计算时,我发现了两个错误。有一个错误和一个相当微妙的错误。
细节有点涉及,所以说正确的操作就足够了
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);