【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)

本文深入解析经典半全局匹配(SGM)算法的关键步骤,包括匹配代价计算、代价聚合及视差优化,探讨如何通过路径代价聚合提升立体匹配精度。
理论恒叨系列

【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化

【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)

由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示。聚合后的新的代价值保存在与匹配代价空间 C C C同样大小的聚合代价空间 S S S中,且元素位置一一对应。

图1:代价聚合前后视差图示意图

为了获得较好的匹配效果,SGM算法依旧采用全局立体匹配算法的思路,即全局能量最优化策略,简单来说就是寻找每个像素的最优视差使得整张影像的全局能量函数最小。全局能量函数的定义如公式1所示:

式1 全局能量函数的定义式

其中, E d a t a E_{data} Edata为数据项,是反应视差图对应的总体匹配代价的测度; E s m o o t h E_{smooth} Esmooth是平滑项,为了让视差图满足某些条件假设的约束,如场景表面的连续性假设,平滑项会对相邻像素视差变化超过一定像素的情况进行惩罚(惩罚一般就是加大能量值)。

解释下视差连续与视差非连续,视差连续代表局部范围内的像素的视差相差很小(1个像素内),是一个连续的变化趋势;而非连续是指局部范围内的像素视差相差很大(超过1个像素),是一个突变的变化趋势。这个局部范围往往是一个矩形的窗口(比如3x3、5x5)。由于视差和深度某种程度上其实是等价的(视差和深度的关系可以查看博客双目立体匹配中的核线约束[极线约束]),所以视差连续性背后表达的是空间中目标表面离相机的距离的连续性,如果是目标是连续的表面在影像上成像,则成像范围内视差也是连续的;而如果目标有前景和背景在影像上成像,则前景和背景的交界处,在局部窗口内会是一部分属于前景一部分属于背景,前景和背景离相机的距离就可能相差很大了,视差也会相差很大,即不连续。

图2 视差连续区域与非连续区域示意图

能量函数最小化是一个二维最优问题,这是一个NP完全问题,有很多近似的较为高效的能量最优策略如图割、置信度传播、合作优化等算法被用来解决这个问题,但是效率上依旧需要进一步改进。为了更高效的解决这个二维最优化问题,SGM算法采用基于类似于扫描线或者叫单方向动态规划的方法,使用一维路径聚合的方式来近似二维最优,相比其他解决方法效率更高,效果相当。

首先,SGM提出的更具体化的能量函数如公式2所示:

式2 SGM能量函数表达式

其中, C C C为匹配代价,公式的第一项是数据项,表示当视差图为 D D D时,所有像素的匹配代价的累加,第二项和第三项是平滑项,表示对像素 p p p N p N_p Np邻域内的所有像素 q q q进行惩罚,其中第二项惩罚力度较小( P 1 P_{1} P1较小),对相邻像素视差变化很小的情况(1个像素)进行惩罚;第三项惩罚力度较大( P 2 > P 1 P_2> P_1 P2>P1),对相邻像素视差变化很大(大于1个像素)的情况进行惩罚。较小的惩罚项可以让算法能够适应视差变化小的情形,如倾斜的平面或者连续的曲面,较大的惩罚项可以让算法正确处理视差非连续情况,由于影像的亮度边缘位置(也就是梯度较大的位置)是前景背景交界的可能性较大,这些位置的像素邻域内往往不是视差连续的,相差较大,为了保护真实场景中的视差非连续情况, P 2 P_2 P2往往是根据相邻像素的灰度差来动态调整,如公式3所示:

式3 P2的调整式

P 2 ′ P_2' P2 P 2 P_2 P2的初始值,一般设置为远大于 P 1 P_1 P1的数。这个公式的含义是:如果像素和它的邻域像素亮度差很大,那么该像素很可能是位于视差非连续区域,则一定程度上允许其和邻域像素的视差差值超过1个像素,对于超过1个像素的惩罚力度就适当减小一点。

实际上,式2中的能量函数最优化问题依旧是一个NP完全问题,为高效的解决它,SGM提出一种路径代价聚合的思路,即将像素所有视差下的匹配代价进行像素周围所有路径上的一维聚合得到路径下的路径代价值,然后将所有路径代价值相加得到该像素聚合后的匹配代价值。像素 p p p沿着某条路径 r r r的路径代价计算方法如式4所示:

式4 像素p沿着某条路径r的路径代价计算公式

其中,第一项为匹配代价值 C C C,属于数据项;第二项是平滑项,表示的是和式2相同的含义,累加到路径代价上的值取不做惩罚、做 P 1 P_1 P1惩罚和做 P 2 P_2 P2惩罚三种情况中代价最小的值;第三项是为了保证新的路径代价值 L r L_r Lr不超过一定数值上限,即

式5

像素的总路径代价值 S S S则通过公式6计算,

式6 总路径代价值S计算公式

路径聚合的示意图如图3所示:

图3 路径聚合示意图

从图3中可以看到,根据路径数不同,聚合的方向也有所不同,一般来说,有4路径(红色箭头方向)、8路径(红色+黑色箭头方向)和16路径(白色箭头方向)三种聚合方式,路径数越多效果越好,但是耗时也会越长,往往需要平衡利弊,根据应用的实际要求来选择合适的路径数。

从公式5及6以及路径数不超过16可以很容易推导出 S ≤ 16 ( C m a x + P 2 ) S≤16(C_{max}+P2) S16(Cmax+P2),这个不等式很重要,它表明选择合适的 P 2 P_2 P2值可以将聚合代价值 S S S控制在一定数值范围内,减少聚合代价数组对内存的占用。如采用基于5×5窗口的Census变换的方法计算得到的匹配代价值 C C C最高不超过25(因为Census变换后的比特串最大有效长度为25),则匹配代价只需用一个字节来存储,而当 P 2 ≤ 65535 / 16 − 25 P_2 ≤ 65535/16-25 P265535/1625时, S S S可以只用两个字节来存储,因为存储代价的 C C C S S S空间大小是 W × H × D W×H×D W×H×D,当影像尺寸较大时,对内存的占用是巨大的,所以减少元素存储所需要的字节数是必要的。

路径代价聚合的理论是基于动态规划的近似最优化求解问题,把当前像素的最优解问题分解成N个方向的子问题最优解,求和是为了让每个方向都有贡献,其实也可以加权求和,为每个方向设定一个权值。如果你确定某几个方向对当前像素确定无帮助反而起反作用,那也可以把这些方向删去。理想情况是所有子问题都确定能对总问题有所联系和贡献,而直接所有方向求和是一种通用做法,也是容易实现的,理论上不一定是最严密合理的,但本就是近似求解,也不需要完全严密的理论。

图4 SGM聚合步骤示意图(视差图呈现,点击看大图)

码上教学系列

【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(2)代价计算
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(5)视差优化
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(6)视差填充
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化

完整代码已发布于Github开源项目:Github/SemiGlobalMatching,欢迎免费下载

博主简介:
Ethan Li 李迎松
武汉大学 摄影测量与遥感专业博士

主方向立体匹配、三维重建

2019年获测绘科技进步一等奖(省部级)

爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com

个人微信:

欢迎交流!

喜欢博主的文章不妨关注一下博主的博客,感谢!
博客主页:https://blog.youkuaiyun.com/rs_lys

### 立体匹配算法的改进方法与最新研究 #### 局部立体匹配算法的改进 局部立体匹配算法主要依赖于窗口内的像素相似度计算。为了提高其性能,可以引入自适应权重机制来优化代价聚合过程。例如,通过动态调整窗口大小或形状以更好地适应图像中的边缘和纹理区域[^1]。此外,结合多尺度分析技术能够进一步提升细节保留能力。 对于具体的实现方式,可以通过以下代码片段展示一种基于加权平均的改进策略: ```python import numpy as np def adaptive_weighted_cost(cost_volume, image): """ 使用自适应权重改善成本体积。 参数: cost_volume (numpy.ndarray): 原始的成本体积。 image (numpy.ndarray): 输入图像用于计算权重。 返回: improved_cost_volume (numpy.ndarray): 改进后的成本体积。 """ weights = compute_weights(image) # 计算自适应权重函数 improved_cost_volume = np.zeros_like(cost_volume) for d in range(cost_volume.shape[-1]): weighted_sum = np.sum(weights * cost_volume[:, :, d], axis=(0, 1)) normalized_sum = weighted_sum / np.sum(weights) improved_cost_volume[:, :, d] = normalized_sum return improved_cost_volume ``` #### 全局立体匹配算法的改进 全局立体匹配通常涉及能量最小化问题,其中平滑项的设计至关重要。最新的研究表明,采用图割(graph cuts)[^2]或者信念传播(belief propagation)的方法可以在一定程度上缓解误匹配现象。特别是当场景中含有遮挡时,这些方法能显著增强鲁棒性。 另外,针对传统全局方法计算复杂度过高的缺点,近年来提出了分层求解思路——先粗略估计视差图再逐步精细化处理。这种方法不仅降低了时间消耗还提高了最终精度。 #### 深度学习驱动下的创新方向 随着人工智能领域的发展,利用神经网络模型替代手工设计特征已成为趋势之一。卷积神经网络(Convolutional Neural Networks,CNNs)被广泛应用于构建端到端训练框架完成从输入图片直接预测稠密视差地图的任务。ResNet架构及其变种形式常作为骨干提取器部分;而hourglass-like结构则有助于捕捉不同层次的空间关系从而促进更精确的结果生成。 以下是简单的PyTorch版本CNN定义样例: ```python import torch.nn as nn class StereoMatchingNetwork(nn.Module): def __init__(self): super(StereoMatchingNetwork, self).__init__() self.feature_extractor = ResNetBackbone() self.cost_processor = HourGlassModule() def forward(self, left_image, right_image): features_left = self.feature_extractor(left_image) features_right = self.feature_extractor(right_image) disparity_map = self.cost_processor(features_left, features_right) return disparity_map ``` #### 总结 无论是通过对经典算法的技术革新还是借助新兴AI工具探索未知可能性,都表明了该课题充满活力的研究前景。未来的工作可能集中于降低资源占用率的同时保持甚至超越当前水平的表现力方面展开深入探讨。
评论 69
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值