Loading

高光谱拼接算法(八)从特征匹配到图像拼接

本篇代码仓位:ImageStitching


经过前面七篇的铺垫,我们已经得到了精确匹配的内点集和一个描述图像间几何关系的全局单应性矩阵。

虽然在现代拼接管道中仍有很多其他处理步骤和相应算法,但就我们目前所拥有的材料,已经可以尝试进行一次最简易的图像拼接。

复述一下我们现有的材料:

  1. 图像 A 和图像 B,二者之间存在重叠区域。
  2. 经过 USAC 提纯的匹配点集和一个全局单应性矩阵 \(H\),描述了从图像 A 到图像 B 的投影变换关系。

而图像拼接的基本思路是这样的:

选择其中一张图像作为参考坐标系,通过单应性矩阵将其他所有图像都变换到这个坐标系下,然后填充像素。

1. 构建画布

有了单应性矩阵之后,不是直接把图像 A 通过单应性矩阵变换到图像 B 上,首先要解决的问题是:

变换后的图像应该放在哪里?

这并不是简单的按方向拼在一起,因为正确的单应性变换会反应真实镜头间的几何关系,图像的位置和大小都会发生改变。 例如负坐标、超出了原图范围以及整幅图像的旋转倾斜等。

c42d28ac-02ec-4f31-9358-4dfe756d4b3c.png

因此,在真正开始像素映射之前,需要先创建一个足够大的目标画布(Canvas)

具体做法如下:

  1. 先保持参考图像 B 的位置不变。
  2. 利用单应性矩阵 \(H\),计算图像 A 四个顶点变换后的坐标。
  3. 统计所有顶点的坐标范围: 将图像 B 的四个角点与图像 A 变换后的四个角点统一放到同一坐标系中,分别统计 \(x_{\min}, x_{\max},y_{\min},y_{\max}\)
  4. 整体平移坐标系: 由于图像数组不能使用负坐标作为索引,因此需要对所有图像**统一施加一个平移:

\[T= \begin{bmatrix} 1&0&-x_{\min}\\ 0&1&-y_{\min}\\ 0&0&1 \end{bmatrix} \]

  1. 构建最终画布: 根据平移后的坐标范围创建一个能够包围所有图像的最小矩形,其宽、高分别为

\[\text{width}=x_{\max}-x_{\min} \]

\[\text{height}=y_{\max}-y_{\min} \]

这样得到的矩形便是最终用于拼接的画布:

bc4b4bcb-029f-4b88-8590-377026baf652.png

2. 填充画布

现在,我们有了合适的区域去放置变换后的图像,而不至于因图像本身的尺寸限制导致裁剪。
但目前画布只是一个空的像素数组,它本身没有任何图像内容。
因此,这步才是拼接的重点工作:

利用两张原始图像去填充这个画布。

2.1 参考图像:平移复制

参考图像 B 不需要几何变换,它只需要根据上一步得到的平移矩阵 \(T\) 进行一次整体平移,之后直接复制像素值即可。

\[T= \begin{bmatrix} 1&0&-x_{\min}\\ 0&1&-y_{\min}\\ 0&0&1 \end{bmatrix} \]

\[B' = T B \]

2.2 变换图像:反向映射

首先要说明的是:这步和上一步并不是前后顺序关系,图像 A 并不是在已经包含 B 的画布上映射的,而是独立的,这和下一步融合有关。

有了单应性矩阵后,图像 A 变换的最直接想法是这样的:

遍历原始图像 A 中的每个像素,用 \(H\) 计算出它在画布中的位置,把像素值填过去。

这种方法被称为前向映射(Forward Warping)

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = H \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]

但前向映射存在一个严重问题:

变换后的坐标 \((x', y')\) 几乎不可能恰好落在整数像素位置上。

这样会导致两类常见后果:

  1. 像素可能被映射到目标图像中的"缝隙"里,导致结果中出现大量空洞
  2. 多个像素映射到同一个位置导致重叠

bdc75d81-af51-48fe-bbc9-8a9a5042660a.png

因此,实际工程中几乎从不使用前向映射,取而代之的是反向映射(Backward/Inverse Warping)

遍历画布中的每个整数像素位置,用 \(H^{-1}\) 计算它在原始图像中的对应位置,然后采样像素值。但只有能够映射回原图有效区域的像素才会被赋值。

反向映射的过程如下:

  1. 对画布中每个整数像素坐标 \((x', y')\),计算:

\[H' = T H \]

\[\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \sim H'^{-1} \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} \]

  1. 在原始图像 A 的 \((x, y)\) 位置插值采样像素值,填入画布的 \((x', y')\)

由于 \(H^{-1}\) 的计算结果通常也是浮点数,因此仍然会遇到"非整数坐标"的问题。
还是老办法:插值,在图像拼接中,双线性插值往往是性价比最高的选择。

393706d5-ec9f-4cad-865c-defec6806be5.png

3. 图像融合

经过上一步,我们已经完成了从原始图像到画布的映射,但这里还有一个明显问题:

拼接图像 AB 间存在重叠区,这部分像素值用谁的?怎么处理?

这便是图像融合部分的逻辑了,这里先引入最基础的内容:

3.1 重叠区识别

重叠区的识别是处理的前提,而这其实在上一步填充时同步进行的:

在图像 AB 分布进行画布填充时同步生成各自掩码,指导图像融合,可以理解为先分别生成两张已经对齐到同一画布上的图像,再根据掩码决定最终输出。

具体如下:

  1. 当参考图像复制或变换图像映射完成后,为其生成一组和画布尺寸相同的掩码,覆盖部分值为 1 ,反之为 0 。
  2. 在融合部分根据掩码情况进行相应判别,指导最终融合:
    • maskA=1, maskB=0 → 非重叠,直接复制 A 值。
    • maskA=0, maskB=1 → 非重叠,直接复制 B 值。
    • maskA=1, maskB=1 → 重叠区域,执行融合处理。

warping_visualization.png

3.2 融合算法

融合算法本身就像之前的特征匹配、误剔除一样,是拼接管道的核心模块,其同样拥有丰富的方法以及持续的演进过程,简单列举如下:

方法 核心思想 优点 缺点
直接覆盖(Direct Copy) 重叠区域直接采用一幅图像的像素 实现最简单,速度最快 接缝明显,亮度变化突兀
加权融合(Feather Blending) 根据距离边界的权重对两幅图进行线性加权 实现简单,可有效减弱接缝 存在重影,对配准误差较敏感
多频带融合(Multi-band Blending) 利用拉普拉斯金字塔在不同频率分别融合 接缝自然,是经典拼接算法的主流方案 计算量较大,实现复杂
最优缝合(Seam Finding) 在重叠区寻找最不显眼的拼接缝,再进行融合 能有效避开运动物体和明显错位 对曝光差异仍较敏感,通常需结合其他融合方法
梯度域融合(Poisson Blending) 保持梯度连续,通过求解泊松方程完成融合 光照过渡自然,颜色一致性好 求解耗时,不适合大规模实时拼接
深度学习融合 利用神经网络学习重叠区域的融合方式 对复杂场景具有较好的适应能力 依赖训练数据,计算成本高

部分具体算法会在之后再详细展开。

4. 更多拼接组件

至此,我们已经完成了一条最基础的图像拼接流程:利用几何变换将两幅图像映射到统一坐标系,再通过融合生成最终结果。
用一组简单数据测试如下:
stitched_result.png

再试试我们之前一直的那组:
image

可以发现拼接的结果中存在重影,而这是因为这组数据存在真实镜头的移动和视差等因素,相比上面那组直接截图的数据存在更复杂的几何关系。

为此,就像开始说的,拼接管道中仍然存在更多内容:当面对多图、大视差、曝光变化以及复杂场景时,现代图像拼接通常包含如下组件:

模块 作用 典型方法
特征提取与描述 提取稳定的局部特征并建立匹配关系 SIFT、SURF、ORB、SuperPoint
鲁棒几何估计 剔除误匹配,估计全局单应性矩阵 RANSAC、USAC
局部几何优化 提高非平面场景下的配准精度 APAP、SPHP、AANAP
全局优化(多图) 联合优化所有图像的相机参数,减少累计误差 Bundle Adjustment
接缝搜索(Seam Finding) 自动寻找最不明显的拼接边界 Graph Cut、Dynamic Programming
曝光补偿 消除不同图像之间的亮度、颜色差异 Gain Compensation、Block Gain Compensation
图像融合(Blending) 平滑重叠区域,使接缝自然过渡 Feathering、Multi-band Blending、Poisson Blending
最终裁剪与矫正 去除黑边,校正整体画面 Auto Cropping、Wave Correction

这些我们都会在之后逐个展开。

posted @ 2026-07-14 22:40  哥布林学者  阅读(15)  评论(0)    收藏  举报