【计算机视觉】详解立体匹配算法:原理、公式与核心策略
摘要:立体匹配(Stereo Matching)是计算机视觉中从双目图像获取深度信息的关键技术。本文将避开繁琐的代码实现,从数学原理和算法逻辑出发,深入解析立体匹配的核心步骤、视差计算公式、能量函数优化以及经典的SGM算法原理。
一、 引言:为什么需要立体匹配?
人类通过双眼观察世界,由于左右眼的位置差异,观察到的物体在视网膜上的成像存在微小的水平位移。这种位移被称为视差(Disparity)。大脑通过处理视差,让我们感知到了深度(Depth)。
在计算机视觉中,立体匹配的目标就是模仿这一过程:通过寻找左右两幅图像中对应的像素点,计算视差图,进而转化为深度图。

二、 核心几何原理
在讨论复杂的匹配算法之前,必须理解最基础的双目测距模型(假设图像已进行极线校正,即左右图行对齐)。
2.1 视差与深度的关系公式
设双目相机的焦距为 𝑓 f ,两相机光心之间的距离(基线)为 𝐵 B 。
对于空间中一点 𝑃 P ,其在左图的横坐标为 𝑥 𝑙 x l ,在右图的横坐标为 𝑥 𝑟 x r 。
视差(Disparity, 𝑑 d )定义为:
𝑑 = 𝑥 𝑙 − 𝑥 𝑟 d=x l −x r
根据相似三角形原理,深度(Depth, 𝑍 Z )与视差的关系为:
𝑍 = 𝑓 ⋅ 𝐵 𝑑 Z= d f⋅B
结论 :
深度 𝑍 Z 与视差 𝑑 d 成反比。视差越大,物体越近;视差越小,物体越远。
当视差 𝑑 → 0 d→0 时,深度趋向无穷远。

三、 立体匹配的算法框架
经典的立体匹配算法通常遵循 Scharstein 和 Szeliski 提出的四个标准步骤:
- 匹配代价计算(Matching Cost Computation)
- 代价聚合(Cost Aggregation)
- 视差计算/优化(Disparity Computation / Optimization)
- 视差细化(Disparity Refinement)

3.1 步骤一:匹配代价计算
这一步是计算左图像素 𝑝 ( 𝑥 , 𝑦 ) p(x,y) 与右图潜在对应像素 𝑝 ( 𝑥 − 𝑑 , 𝑦 ) p(x−d,y) 之间的相似度。常用的代价函数有以下几种:
-
绝对差值和 (SAD) / 单像素绝对差 (AD)
最简单的计算方式,计算像素灰度值的差的绝对值。
𝐶 𝐴 𝐷 ( 𝑥 , 𝑦 , 𝑑 ) = ∣ 𝐼 𝐿 ( 𝑥 , 𝑦 ) − 𝐼 𝑅 ( 𝑥 − 𝑑 , 𝑦 ) ∣ C AD (x,y,d)=∣I L (x,y)−I R (x−d,y)∣
-
平方差和 (SSD) / 单像素平方差 (SD)
对差值进行平方,对大误差更敏感。
𝐶 𝑆 𝐷 ( 𝑥 , 𝑦 , 𝑑 ) = ( 𝐼 𝐿 ( 𝑥 , 𝑦 ) − 𝐼 𝑅 ( 𝑥 − 𝑑 , 𝑦 ) ) 2 C SD (x,y,d)=(I L (x,y)−I R (x−d,y)) 2
-
归一化互相关 (NCC)
对光照变化具有较好的鲁棒性,但在纹理弱的区域表现一般。公式较为复杂,本质是计算两个窗口内的统计相关性(余弦相似度)。
-
Census 变换 (非参数变换)
Census变换是一种基于相对灰度关系的变换,对光照变化极度鲁棒。它将窗口内的像素与中心像素比较,生成一串二进制码(Bit String),通过计算**汉明距离(Hamming Distance)**作为代价。
3.2 步骤二 & 三:代价聚合与优化策略
这是立体匹配算法分流的关键点,主要分为局部算法和全局算法。
A. 局部匹配算法 (Local Methods)
原理:假设在一个局部窗口内,所有像素的视差是相同的。
公式 :对窗口 𝑊 W 内的代价进行求和聚合。
𝑆 ( 𝑥 , 𝑦 , 𝑑 ) = ∑ ( 𝑖 , 𝑗 ) ∈ 𝑊 𝐶 ( 𝑖 , 𝑗 , 𝑑 ) S(x,y,d)= (i,j)∈W ∑ C(i,j,d)
策略 :采用**赢家通吃(Winner-Takes-All, WTA)**策略,直接选择聚合代价最小的 𝑑 d 作为最终视差。
𝑑 𝑏 𝑒 𝑠 𝑡 = arg min 𝑑 𝑆 ( 𝑥 , 𝑦 , 𝑑 ) d best =arg d min S(x,y,d)
优点 :速度极快,适合实时应用。
缺点:在弱纹理区域(如白墙)和视差不连续区域(物体边缘)效果差,容易产生"肥大"效应。
B. 全局匹配算法 (Global Methods)
原理:将立体匹配转化为一个能量最小化问题。不仅考虑像素匹配的相似度,还考虑视差图的平滑性。
能量函数公式 :
𝐸 ( 𝐷 ) = 𝐸 𝑑 𝑎 𝑡 𝑎 ( 𝐷 ) + 𝜆 𝐸 𝑠 𝑚 𝑜 𝑜 𝑡 ℎ ( 𝐷 ) E(D)=E data (D)+λE smooth (D)
数据项 𝐸 𝑑 𝑎 𝑡 𝑎 ( 𝐷 ) E data (D) :描述匹配代价的总和。
𝐸 𝑑 𝑎 𝑡 𝑎 ( 𝐷 ) = ∑ 𝑝 𝐶 ( 𝑝 , 𝑑 𝑝 ) E data (D)= p ∑ C(p,d p )
平滑项 𝐸 𝑠 𝑚 𝑜 𝑜 𝑡 ℎ ( 𝐷 ) E smooth (D) :惩罚相邻像素视差变化过大的情况(假设相邻像素深度应该是连续的)。通常使用 Potts 模型或截断线性模型。
𝐸 𝑠 𝑚 𝑜 𝑜 𝑡 ℎ ( 𝐷 ) = ∑ ( 𝑝 , 𝑞 ) ∈ 𝑁 𝑉 ( 𝑑 𝑝 , 𝑑 𝑞 ) E smooth (D)= (p,q)∈N ∑ V(d p ,d q )
求解方法:由于这是个NP难问题,通常使用 图割(Graph Cuts) 或 置信度传播(Belief Propagation) 来近似求解。
优点 :精度极高,边缘清晰。
缺点:计算量巨大,难以实时。
C. 半全局匹配 (Semi-Global Matching, SGM)
SGM 是目前工业界应用最广泛的算法,它平衡了局部算法的速度和全局算法的精度。
核心原理 :
SGM 不在2D图像上进行全局优化,而是将问题分解为多个1D路径(通常是8个或16个方向)上的动态规划问题。
路径聚合公式 :
沿某路径 𝑟 r 聚合到像素 𝑝 p 、视差为 𝑑 d 的代价 𝐿 𝑟 ( 𝑝 , 𝑑 ) L r (p,d) 定义为:

𝐶 ( 𝑝 , 𝑑 ) C(p,d) :当前像素的匹配代价。
𝑃 1 P 1 :对小视差变化(斜坡表面)的惩罚系数。
𝑃 2 P 2 :对大视差变化(深度断层)的惩罚系数( 𝑃 2 > 𝑃 1 P 2 >P 1 )。
最后一项是为了防止路径代价数值无限累加而进行的归一化。
最终的代价是所有路径代价之和:
𝑆 ( 𝑝 , 𝑑 ) = ∑ 𝑟 𝐿 𝑟 ( 𝑝 , 𝑑 ) S(p,d)= r ∑ L r (p,d)
3.3 步骤四:视差细化
经过上述计算得到的视差图通常包含噪声和遮挡区的错误,需要后续处理:
-
左右一致性检测 (Left-Right Consistency Check) :
分别以左图和右图为基准计算两张视差图,如果某点 𝑑 𝐿 → 𝑅 ≠ 𝑑 𝑅 → 𝐿 d L→R =d R→L ,则视为遮挡点或无效点。
-
亚像素插值 (Sub-pixel Interpolation) :
由于视差通常是离散整数,为了得到更平滑的深度,通过拟合代价曲线的抛物线极值点来获得小数视差。
-
中值滤波:去除椒盐噪声。
四、 总结
立体匹配算法从数学本质上是一个寻找最优解的过程。
- 基本公式: 𝑍 = 𝑓 𝐵 / 𝑑 Z=fB/d 是物理基础。
- 局部算法:基于窗口求和,快但不准。
- 全局算法:基于能量最小化 𝐸 = 𝐸 𝑑 𝑎 𝑡 𝑎 + 𝐸 𝑠 𝑚 𝑜 𝑜 𝑡 ℎ E=E data +E smooth ,准但太慢。
- SGM算法:利用动态规划在多路径上聚合代价,是目前传统算法中的性价比之王。
随着深度学习的发展,基于CNN的立体匹配(如PSMNet, GC-Net, RAFT-Stereo)正在逐渐取代传统算法,但理解上述几何原理和能量函数设计,依然是掌握3D视觉技术的基石。
图片来源于网络,如有侵权,请联系删除