我发现了问题所在。我的解决方案是我从头顶开始的。当我坐下来详细计算时,我发现了两个错误。有一个错误和一个相当微妙的错误。
细节是涉及的,所以足以说正确的操作是
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);
答案 0 :(得分:0)
您可能需要更正图像以获得径向扭曲。我建议您仔细查看Rick Szeliski的书“计算机视觉”,了解该主题的详细信息。