从特征匹配到图像拼接
经过前面七篇的铺垫我们已经得到了精确匹配的内点集和一个描述图像间几何关系的全局单应性矩阵。虽然在现代拼接管道中仍有很多其他处理步骤和相应算法但就我们目前所拥有的材料已经可以尝试进行一次最简易的图像拼接。复述一下我们现有的材料图像 A 和图像 B二者之间存在重叠区域。经过 USAC 提纯的匹配点集和一个全局单应性矩阵描述了从图像 A 到图像 B 的投影变换关系。而图像拼接的基本思路是这样的选择其中一张图像作为参考坐标系通过单应性矩阵将其他所有图像都变换到这个坐标系下然后填充像素。构建画布#有了单应性矩阵之后不是直接把图像 A 通过单应性矩阵变换到图像 B 上首先要解决的问题是变换后的图像应该放在哪里这并不是简单的按方向拼在一起因为正确的单应性变换会反应真实镜头间的几何关系图像的位置和大小都会发生改变。 例如负坐标、超出了原图范围以及整幅图像的旋转倾斜等。c42d28ac-02ec-4f31-9358-4dfe756d4b3c.png因此在真正开始像素映射之前需要先创建一个足够大的目标画布Canvas。具体做法如下先保持参考图像 B 的位置不变。利用单应性矩阵计算图像 A 四个顶点变换后的坐标。统计所有顶点的坐标范围 将图像 B 的四个角点与图像 A 变换后的四个角点统一放到同一坐标系中分别统计。整体平移坐标系 由于图像数组不能使用负坐标作为索引因此需要对所有图像**统一施加一个平移构建最终画布 根据平移后的坐标范围创建一个能够包围所有图像的最小矩形其宽、高分别为这样得到的矩形便是最终用于拼接的画布bc4b4bcb-029f-4b88-8590-377026baf652.png填充画布#现在我们有了合适的区域去放置变换后的图像而不至于因图像本身的尺寸限制导致裁剪。但目前画布只是一个空的像素数组它本身没有任何图像内容。因此这步才是拼接的重点工作利用两张原始图像去填充这个画布。2.1 参考图像平移复制#参考图像 B 不需要几何变换它只需要根据上一步得到的平移矩阵进行一次整体平移之后直接复制像素值即可。2.2 变换图像反向映射#首先要说明的是这步和上一步并不是前后顺序关系图像 A 并不是在已经包含 B 的画布上映射的而是独立的这和下一步融合有关。有了单应性矩阵后图像 A 变换的最直接想法是这样的遍历原始图像 A 中的每个像素用计算出它在画布中的位置把像素值填过去。这种方法被称为前向映射Forward Warping但前向映射存在一个严重问题变换后的坐标几乎不可能恰好落在整数像素位置上。这样会导致两类常见后果像素可能被映射到目标图像中的缝隙里导致结果中出现大量空洞。多个像素映射到同一个位置导致重叠。bdc75d81-af51-48fe-bbc9-8a9a5042660a.png因此实际工程中几乎从不使用前向映射取而代之的是反向映射Backward/Inverse Warping遍历画布中的每个整数像素位置用计算它在原始图像中的对应位置然后采样像素值。但只有能够映射回原图有效区域的像素才会被赋值。反向映射的过程如下对画布中每个整数像素坐标计算在原始图像 A 的位置插值采样像素值填入画布的。由于的计算结果通常也是浮点数因此仍然会遇到非整数坐标的问题。还是老办法插值在图像拼接中双线性插值往往是性价比最高的选择。393706d5-ec9f-4cad-865c-defec6806be5.png图像融合#经过上一步我们已经完成了从原始图像到画布的映射但这里还有一个明显问题拼接图像 AB 间存在重叠区这部分像素值用谁的怎么处理这便是图像融合部分的逻辑了这里先引入最基础的内容3.1 重叠区识别#重叠区的识别是处理的前提而这其实在上一步填充时同步进行的在图像 AB 分布进行画布填充时同步生成各自掩码指导图像融合可以理解为先分别生成两张已经对齐到同一画布上的图像再根据掩码决定最终输出。具体如下当参考图像复制或变换图像映射完成后为其生成一组和画布尺寸相同的掩码覆盖部分值为 1 反之为 0 。在融合部分根据掩码情况进行相应判别指导最终融合maskA1, maskB0 → 非重叠直接复制 A 值。maskA0, maskB1 → 非重叠直接复制 B 值。maskA1, maskB1 → 重叠区域执行融合处理。warping_visualization.png3.2 融合算法#融合算法本身就像之前的特征匹配、误剔除一样是拼接管道的核心模块其同样拥有丰富的方法以及持续的演进过程简单列举如下方法 核心思想 优点 缺点直接覆盖Direct Copy 重叠区域直接采用一幅图像的像素 实现最简单速度最快 接缝明显亮度变化突兀加权融合Feather Blending 根据距离边界的权重对两幅图进行线性加权 实现简单可有效减弱接缝 存在重影对配准误差较敏感多频带融合Multi-band Blending 利用拉普拉斯金字塔在不同频率分别融合 接缝自然是经典拼接算法的主流方案 计算量较大实现复杂最优缝合Seam Finding 在重叠区寻找最不显眼的拼接缝再进行融合 能有效避开运动物体和明显错位 对曝光差异仍较敏感通常需结合其他融合方法梯度域融合Poisson Blending 保持梯度连续通过求解泊松方程完成融合 光照过渡自然颜色一致性好 求解耗时不适合大规模实时拼接深度学习融合 利用神经网络学习重叠区域的融合方式 对复杂场景具有较好的适应能力 依赖训练数据计算成本高部分具体算法会在之后再详细展开。更多拼接组件#至此我们已经完成了一条最基础的图像拼接流程利用几何变换将两幅图像映射到统一坐标系再通过融合生成最终结果。用一组简单数据测试如下stitched_result.png再试试我们之前一直的那组