我已经有了一种算法,可以通过图像配准制作全景图像马赛克,然后在重叠区域中混合图像。
来自维基百科的下图说明了通过在重叠区域中找到最佳分割线将平移运动缝合在一起的几张图像:
现在我想将这种混合算法扩展到各种全景图像投影。
最简单的情况是平面投影,其中不存在任何混合问题。下图说明了两个图像和缝合线。
我基本上可以从画布中获取一个区域(已经缝合的合成图像)和图像中的相应区域,然后将两者混合在一起并将混合区域渲染回画布:
这是针对每个新图像按顺序完成的。
但是,当我尝试使用球面投影和 360° 马赛克时,当两个图像及其重叠区域跨越 360° 边界时会出现问题:
我不能再取出一个简单的矩形区域来混合,因为我必须依靠wrapping。
更糟糕的是,在立方体贴图上混合图像可以将重叠区域分成两部分或三部分:
我提出了一些关于如何在球面或立方体贴图上混合图像的解决方案,但没有一个是令人满意的:
解决方案 1
分别处理立方体的每个面(或类似地,分别处理球面图的每个部分)。不幸的是,这会在立方体的两个面相交处产生可见的伪影,因为相邻面中的图像混合是不同的次优解决方案。
解决方案 2
在新添加的图像的上下文中执行混合。这需要在新添加图像的坐标系中从立方体贴图(或球面贴图)逆投影合成图像,将两个图像融合并将重叠区域投影回合成表面上。
这应该可以工作并消除伪影,但由于数据反复来回投影,因此需要更多计算。
解决方案 3
始终在球形表面上混合,然后将整个马赛克投影到任何表面上。
这减少了单一类型表面上的混合问题,但球面投影会不均匀地处理图像部分,并且需要更精细的方法(例如在三角球上混合图像)以确保高质量的重新投影。
解决方案 4
执行混合时,提供一个正确映射越界坐标的函数。
这与解决方案 2 类似,但由于映射函数会被过于频繁地调用(混合算法可能会多次访问相同的像素位置),因此计算量可能会更大。
题
如何在球面或立方体贴图或其他一些常见的合成面上有效地融合多个图像?