1. 概述
在本教程中,我们将介绍视差(disparity),这是立体视觉(Stereo Vision)中一个非常基础且重要的概念。我们将先说明视差图在计算机视觉中是如何用于从两张图像重建场景的三维结构的,然后展示如何计算视差图。
2. 立体视觉简介
我们人类通过双眼可以感知深度信息,计算机也可以通过立体视觉技术模拟这种能力。立体视觉是一种通过多张图像来估计场景三维结构的计算机视觉方法。它广泛应用于机器人导航和高级驾驶辅助系统(ADAS)等领域。
其基本思想是:使用两个相机从不同位置拍摄同一场景,然后为每个像素估计其深度信息。这一任务可以通过在两张图像中找到匹配的像素点,并结合已知的相机几何布局来实现。
3. 视差图(Disparity Map)
视差是指立体图像对中物体位置的偏移现象。 你可以闭上一只眼再快速切换另一只眼观察,会发现近处的物体移动明显,远处的物体几乎不动。这种现象就称为视差。
要计算视差图,首先需要将左图中的每个像素与右图中的对应像素进行匹配,然后计算它们之间的位移距离。最终,将这些距离值以灰度图像的形式表示出来,就得到了视差图。
下面是一组立体图像及其对应的视差图示例:
可以看到,前景物体(如灯和雕像)在两张图像中明显偏移,因此在视差图中表现为较亮的像素。而背景中的物体位移较小,视差值较低。
正如前面所说,深度与视差成反比关系。 如果我们知道相机的几何布局,就可以通过三角化(triangulation)将视差图转换为深度图。
当视差接近零时,微小的视差变化会导致深度的巨大变化;而当视差较大时,视差的小变化对深度影响不大。因此,立体视觉系统对靠近相机的物体具有较高的深度分辨率。
4. 对应点匹配问题(Correspondence Problem)
计算视差图的核心在于解决所谓的“对应点匹配问题”。 该问题的目标是确定立体图像中哪些像素点是空间中同一个物理点的投影。
一个重要的简化方法是使用图像校正(rectification)。经过校正后,对应的像素点会位于同一水平线上,从而将二维的匹配问题简化为一维问题。
图像校正的效果如下图所示:
最基础的匹配算法之一是“块匹配算法(Block Matching)”。它的核心思想是:在左图中选取一个像素点,以其为中心取一个窗口(block),然后在右图的同一行中滑动窗口,计算每个窗口之间的匹配损失(loss),找到损失最小的窗口作为最佳匹配点。
假设左图中某点为 $(x, y)$,在右图中最匹配的点为 $(\tilde{x}, y)$,则该点的视差值为:
$$ d(x, y) = \tilde{x} - x $$
块匹配中常用的两个匹配函数如下:
✅ SAD(Sum of Absolute Differences)
计算两个窗口中像素差值的绝对值之和:
$$ \text{SAD}(W^L, W^R)=\sum^N_{i=1} \sum^M_{j=1} \left|W^{L}{i j}-W^{R}{i j}\right| $$
✅ SSD(Sum of Squared Differences)
计算两个窗口中像素差值的平方和:
$$ \text{SSD}(W^L, W^R)=\sum^N_{i=1} \sum^M_{j=1} \left(W^{L}{i j}-W^{R}{i j}\right)^2 $$
⚠️ 一般推荐使用 SAD,因为它在计算速度和抗噪能力方面优于 SSD,对异常值(outlier)也更鲁棒(robust)。
5. 总结
本文我们介绍了视差的基本概念,以及它在立体视觉中的作用。我们还讲解了如何通过块匹配算法生成视差图,并比较了 SAD 与 SSD 这两种常用匹配策略的优缺点。
✅ 关键要点回顾:
- 视差反映了左右图像中像素点的偏移程度
- 视差越大,物体离相机越近
- 图像校正可大大简化匹配问题
- 块匹配是计算视差图的常用方法
- SAD 通常比 SSD 更快、更鲁棒
如你所见,视差图是立体视觉系统中实现深度估计的关键一步。后续若想进一步提升精度,还可以引入更复杂的优化算法或深度学习模型。