4、匹配代价计算概述:代价函数的作用、常见代价类型及选择原则

匹配代价计算是立体匹配流程中的第一道核心工序,其本质是度量左右图像中两个像素(或像素块)属于同一空间点的“可能性”或“相似性”。在双目视觉系统中,我们通过极线校正将二维搜索降维为一维搜索,但一维搜索仍然面临光照差异、弱纹理、重复纹理、遮挡和噪声等挑战。代价函数的设计直接决定了后续代价聚合、视差优化和视差细化的上限——如果代价计算阶段无法有效区分正确匹配与错误匹配,后续任何精妙的聚合算法都无法从根本上挽回信息损失。本章将系统梳理代价函数的作用机制、三类主流代价类型(像素级、区域级、特征级)的数学原理与适用场景,并给出工程实践中的选择原则与组合策略。

匹配代价计算:三类代价类型与选择决策路径 左图 I_L 像素坐标 (x,y) 右图 I_R 搜索范围 d ∈ [d_min, d_max] 代价计算核心 C(x, y, d) 相似度度量函数 输出:代价体 Cost Volume 尺寸 W×H×D 像素级代价 AD / SD / TAD 单像素灰度/颜色差 区域级代价 SAD / SSD / NCC / Census 窗口内结构相似度 特征级代价 梯度 / 边缘 / 描述子 稀疏或半稠密匹配 代价体 C(x,y,d) → 代价聚合 → 视差优化 → 后处理 选择原则(工程决策) ① 纹理丰富 → 像素级/区域级均可 ② 弱纹理/重复纹理 → 区域级 + Census ③ 光照变化大 → 特征级梯度 / Census ④ 实时性要求高 → 像素级 AD / SAD 代价函数选择需权衡:精度、鲁棒性、计算复杂度、硬件资源

4.1 代价函数的核心作用:从相似度度量到代价体构建

匹配代价函数在立体匹配中的角色,可以类比为“裁判员”——它负责对左右图像中每一个候选视差组合给出评分。具体而言,对于左图像素 (x, y),在视差 d 下,右图像素坐标为 (x-d, y),代价函数 C(x, y, d) 输出一个标量值,表示这两个像素属于同一空间点的“不相似程度”。代价越小,匹配越可靠;代价越大,匹配越不可靠。当遍历所有视差范围 [d_min, d_max] 后,便形成一个三维代价体(Cost Volume),其尺寸为 W × H × D,其中 W、H 为图像宽高,D = d_max - d_min + 1 为视差搜索范围。

代价体的质量直接决定了后续步骤的“天花板”。如果代价函数在真实视差处无法给出全局最小值,那么即使代价聚合和视差优化算法再先进,最终输出的视差图也必然存在系统性偏差。因此,代价函数的设计需要满足三个基本要求:区分度(正确匹配与错误匹配的代价差异足够大)、鲁棒性(对光照变化、噪声、辐射畸变不敏感)、计算效率(在硬件平台上能够实时或准实时运行)。

工程经验:在实际项目中,代价函数的选择往往不是“越复杂越好”。例如在FPGA上实现实时立体匹配时,通常优先选择计算简单的AD或SAD;而在离线高精度重建场景中,可以选择Census变换或梯度特征组合。建议在项目初期建立一个小型评测集(包含室内、室外、弱纹理、高光等典型场景),用统一的评测指标(如误匹配率、EPE)对比不同代价函数的性能,再做决策。

4.2 像素级代价:简单高效的基础度量

像素级代价直接利用单个像素的灰度或颜色信息进行相似度计算,不涉及邻域信息。最基础的两种形式是差(AD,Absolute Difference)和平方差(SD,Squared Difference)。对于灰度图像,AD 定义为 C_AD(x,y,d) = |I_L(x,y) - I_R(x-d,y)|;SD 定义为 C_SD(x,y,d) = (I_L(x,y) - I_R(x-d,y))²。对于彩色图像,可以分别计算三个通道的差值后求和或取平均。AD 计算量极小,适合硬件实现,但对光照差异和噪声非常敏感——一个像素的灰度扰动就可能改变匹配结果。

为了缓解像素级代价的脆弱性,实践中常使用截断AD(Truncated AD,TAD),即对差值设置一个阈值 T,超过阈值的部分截断为常数:C_TAD = min(|I_L - I_R|, T)。截断操作可以抑制异常值(如高光反射、传感器噪声)对代价的过度影响。另一种改进是使用梯度信息,例如计算像素在x和y方向的梯度幅值,再对梯度差进行AD度量。梯度对光照偏移具有一定的不变性,因为光照变化通常改变灰度值,但对局部梯度的影响较小。

代价类型公式计算量鲁棒性适用场景
AD|I_L - I_R|极低差(对噪声/光照敏感)理想光照、实时FPGA
SD(I_L - I_R)²低差(放大误差)极少单独使用
TADmin(|I_L - I_R|, T)低中(截断抑制异常值)中等光照变化、嵌入式
梯度AD|∇I_L - ∇I_R|中中高(对光照偏移不敏感)户外光照变化场景

像素级代价的典型应用场景是硬件加速的实时立体匹配系统。例如在自动驾驶的视觉感知模块中,FPGA上通常使用TAD或梯度AD作为代价函数,配合后续的SGM(半全局匹配)聚合,在1080P分辨率下达到30fps以上的处理速度。但像素级代价在弱纹理区域(如白墙、天空)和重复纹理区域(如栅栏、百叶窗)几乎失效,因为多个候选视差可能产生相近的代价,导致歧义。

4.3 区域级代价:利用邻域信息增强区分度

区域级代价以像素为中心取一个固定大小的窗口(如 3×3、5×5、9×7),计算窗口内所有像素的相似度并累加。这种做法的核心思想是:单个像素可能受噪声干扰,但窗口内的整体结构信息更稳定。最常见的区域级代价包括 SAD(差之和)、SSD(平方差之和)、NCC(归一化互相关)和 Census 变换。

SAD 是 AD 的窗口累加形式:C_SAD(x,y,d) = Σ_{(i,j)∈W} |I_L(x+i, y+j) - I_R(x-d+i, y+j)|。SAD 计算简单,在FPGA上可以用流水线方式高效实现,但窗口大小需要权衡:窗口越大,对噪声的抑制越强,但也会模糊视差边缘(前景和背景交界处)。NCC 则通过归一化消除线性光照变化的影响,其公式为:

C_NCC = Σ[(I_L - μ_L)(I_R - μ_R)] / √[Σ(I_L - μ_L)² · Σ(I_R - μ_R)²]

其中 μ_L、μ_R 分别为左右窗口内的灰度均值。NCC 的取值范围为 [-1, 1],值越大表示越相似,因此实际使用时通常取负值或取反作为代价。NCC 对增益和偏置变化具有不变性,但计算量较大,且窗口内灰度方差过小时(如平坦区域)会出现除零问题。

Census 变换 是一种非参数化方法,它将窗口内每个像素与中心像素比较,大于中心像素记为1,否则记为0,形成一个二进制比特串。然后通过计算两个比特串的汉明距离(不同位的个数)作为代价。Census 对光照变化和辐射畸变具有极强的鲁棒性,因为它只依赖像素间的相对大小关系,而非灰度值。Census 的缺点是:在重复纹理区域可能产生歧义,且对窗口中心像素的噪声敏感。

实战建议:在户外机器人或自动驾驶场景中,强烈推荐使用 Census 变换作为基础代价。例如在 KITTI 数据集上,Census + SGM 的组合在中等纹理区域能达到 5% 以内的误匹配率。如果硬件资源允许,可以将 Census 与梯度特征融合,进一步提升在弱纹理区域的性能。

4.4 特征级代价:面向稀疏匹配与语义信息

特征级代价不直接使用像素灰度,而是提取图像中的高级特征(如边缘、角点、SIFT描述子、ORB特征等)进行匹配。这类方法通常用于稀疏匹配或半稠密匹配,输出的是特征点的视差,而非全像素视差图。特征级代价的优势在于:对光照变化、视角变化和噪声具有更强的鲁棒性,且计算量远小于逐像素的稠密匹配。但缺点是:特征提取本身可能失败(如弱纹理区域没有足够特征点),且特征匹配的精度受限于特征点定位精度。

在立体匹配中,特征级代价常作为辅助信息与区域级代价结合。例如,可以先通过特征匹配获得一组高置信度的稀疏视差点,然后利用这些点作为“锚点”引导稠密匹配的代价聚合过程。另一种常见做法是使用梯度直方图(HOG)或局部二值模式(LBP)作为特征描述子,在较大窗口内计算相似度。这类方法在结构光或主动立体系统中表现优异,因为投影图案提供了丰富的人工纹理。

特征级代价的选择需要根据应用场景权衡:如果目标是生成高精度稠密视差图(如三维重建),特征级代价通常只作为辅助;如果目标是快速获取场景深度轮廓(如避障),特征级代价可以直接输出稀疏深度点云,配合插值算法生成半稠密深度图。

4.5 代价函数选择原则:精度、鲁棒性与计算资源的三角权衡

在实际工程中,选择代价函数需要综合考虑三个维度:精度需求(允许的误匹配率)、鲁棒性需求(光照、噪声、纹理条件)和计算资源(CPU/GPU/FPGA的算力与功耗)。以下是一套可操作的决策流程:

  1. 明确应用场景:是室内固定光照(如工业检测)还是户外动态光照(如自动驾驶)?是离线处理还是实时处理?
  2. 评估纹理条件:对目标场景进行灰度直方图和梯度幅值统计。如果梯度幅值均值较高(纹理丰富),像素级或简单区域级即可;如果梯度幅值低(弱纹理),需要引入 Census 或特征级方法。
  3. 测试候选代价:在代表性图像对上运行 3-5 种候选代价函数,使用视差图与真值(如果有)对比,计算误匹配率(阈值 >1px)和平均端点误差(EPE)。
  4. 硬件映射:将选定的代价函数映射到目标硬件平台,评估资源占用(LUT、DSP、BRAM)和延迟。例如 Census 变换在FPGA上需要额外的比较器和位计数逻辑,但整体资源可控。
  5. 组合策略:如果单一代价无法满足需求,采用加权融合。例如 C_total = α·C_Census + β·C_Gradient + γ·C_AD,权重通过网格搜索或经验设定。

常见误区:① 盲目追求复杂代价函数,导致计算量爆炸而精度提升有限;② 忽略窗口大小对视差边缘的影响——大窗口在物体边界处会产生“前景膨胀”效应;③ 在弱纹理区域单独使用像素级代价,导致视差图出现大量空洞;④ 没有对代价进行归一化处理,导致不同视差范围的代价尺度不一致,影响后续聚合。

4.6 案例拆解:户外机器人双目系统的代价函数选型

项目背景:某巡检机器人搭载双目相机(基线12cm,分辨率1280×720,帧率30fps),需要在户外环境下实现障碍物检测和地形重建。户外光照变化剧烈(晴天阴影、逆光、黄昏),且场景包含大量草地、水泥路面等弱纹理区域。

初始方案与问题:团队最初选用 SAD(窗口5×5)作为代价函数,配合SGM聚合。实测发现:在阴影边界处出现大量误匹配(误匹配率约12%),在草地区域视差图呈“噪声状”分布。分析原因:SAD对光照增益变化敏感,阴影区域灰度整体偏移导致代价失真;草地纹理重复且弱,窗口内灰度方差小,SAD无法区分不同视差。

优化过程:第一步,将代价函数替换为 Census 变换(窗口9×7),误匹配率降至7%。第二步,引入梯度特征作为辅助代价,与Census加权融合(权重 α=0.7, β=0.3),误匹配率进一步降至4.5%。第三步,针对弱纹理区域,在代价聚合阶段增加基于颜色分割的平滑约束,最终误匹配率稳定在3.8%。整个优化过程中,FPGA资源占用从原来的LUT 45% 增至 62%,DSP 使用率从 20% 增至 35%,仍在预算范围内。

复盘经验:① 代价函数选型必须基于真实场景测试,不能仅依赖公开数据集;② Census 在光照鲁棒性上远优于 SAD,但需要配合适当的窗口大小(过大窗口会丢失细节);③ 多特征融合是提升弱纹理区域性能的有效手段,但权重需要根据场景动态调整;④ 硬件实现时,Census 的位串比较可以复用 DSP 的异或逻辑,但要注意位宽对齐。

下表总结了不同场景下的代价函数推荐配置,可作为项目初期的参考起点:

应用场景推荐代价窗口/参数理由
室内工业检测(固定光照)TAD 或 SAD5×5计算快,光照稳定
户外自动驾驶(动态光照)Census + 梯度9×7 Census光照鲁棒,弱纹理适应
无人机航拍(视角变化大)NCC 或特征描述子11×11对几何畸变有一定容忍
AR/VR 实时深度(移动端)简化 Census5×5低功耗,硬件友好

最后需要强调的是,代价函数并非孤立存在,它与代价聚合、视差优化是强耦合的。在实际项目中,建议先选定一个基础代价(如 Census),跑通整个立体匹配流程,再逐步替换或融合其他代价函数,以系统化的方式评估性能变化。这种“先通后优”的策略可以避免在代价函数上过度投入而忽视其他环节的瓶颈。