Stereo Processing by Semi-Global Matching and Mutual Information基础算法解析

本文主要是介绍Stereo Processing by Semi-Global Matching and Mutual Information基础算法解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

*原创文章,非作者允许,禁止一切形式的转载。

Stereo Processing by Semi-Global Matching and Mutual Information 是立体匹配中一个非常有名的算法,算法快、重建精度也不错、非常适合并行加速。

 

A.匹配代价计算

这部分作者在讲匹配代价计算,作者用的是信息熵,然而在实际应用中发现这一匹配代价好像效果也比较一般,使用census transform的很多。如果对信息熵想仔细了解,可以参考 @迷雾forest 这篇文章。

代价计算这一步,首先要确定disparity range(就是你觉得这张图片中场景的深度范围,比如是20),然后对disparity range划分间隔,可以把间隔划分为256份,这里间隔是多少,就决定了视差图的分辨率。每一个深度值都可以计算出每个像素处的匹配代价,那么就得到了一个cost volume,如图1所示,宽width高height分别对应图像的宽和高 ,disparity range是深度空间,每一个小格子是一个匹配代价。

图1. 匹配代价图

 

B.代价聚合

匹配代价是有噪音的,有时候错误的深度对应的匹配代价反而会比正确深度对应的匹配代价小。因此需要进行优化,也就是代价聚合。论文中构建的能量函数是:

\small E(D)=\sum_{p}(C(p,D_{p})+\sum_{ q\in N_{p}}P_{1}T[|D_{p}-D_{q}|=1]+\sum_{ q\in N_{p}}P_{2}T[|D_{p}-D_{q}|>1]) \quad (1) 

第一项是匹配代价,第二项表示如果该像素的视差与周围像素相差1,则要加一个值为P1的惩罚,注意这里是累加符号,表明周围有几个视差相差1的像素,则要加几个P1,第三项表示如果该像素的视差与周围像素相差大于1,则要加一个值为P2的惩罚。也是周围有多少个像素满足就要加几个P2.。为什么要有第二项和第三项呢?这两项往往也被称为平滑项,可以这样理解,一个像素点的视差值取决于他自身的cost以及周围像素的视差情况,如果完全相信自身,那就是第一项,但是自身有误差,所以要考虑周围的像素的视差,那么就是后两项,但是要想相信周围的视差必须要加一个惩罚项,表明来自周围的信息的可靠程度没有自身cost的可靠程度高,P1的惩罚主要是为了在弯曲或者倾斜的表面进行调整(深度变化小),P2的惩罚则主要是为了处理深度不连续的情况(深度变化大)。

要最小化这个能量函数,直接求解很困难,论文中说是NPcomplete 问题,但是如果在单独的行上进行1D的求解,求解将会非常的快,所以作者把这个问题分成了在多个方向上进行1D的求解,把一个二维问题分解成多个一维求解问题,注意这里只是一种近似,因此最终的结果并不一定是最优的。下面先说1D方向上的代价聚合:

\large L_{r}^{'}(p,d)}=C(p,d)+min(L_{r}^{'}(p-r,d),L_{r}^{'}(p-r,d-1)+P1,L_{r}^{'}(p- r,d+1)+P1,min_{i}}L_{r}^{'}(p-r,i)+P2) \qquad \qquad (2)

第一项是匹配代价,后面的项是传播项。公式的意思是说当前像素某个深度对应的聚合的代价=自己本身的代价(就是census计算的代价)+传播过来的代价,传播过来的代价根据深度不同分为四类:a,等于当前深度 b,比当前深度少1 c,比当前深度大1 d,其他深度值,会在这四类深度中选择一个对应的代价最小的深度,如果是a类深度,就直接是对应代价,如果是b,c类深度,需要在对应代价的基础上加上P1,如果是d类深度,需要在对应代价的基础上加P2。 如下图:注意这里有个简化是d类深度加P2,只需找到d类深度的最小代价加P2即可

图2. 一个方向上某个像素的代价聚合过程

 

图2是一个方向上的某个像素代价聚合的过程,假设有10个深度空间,d=1,2...10,分别对应10个匹配代价,该匹配代价就是第一步计算的匹配代价聚合后的结果,当前像素的匹配代价就是第一步直接计算出的匹配代价,然后每个匹配代价都按照公式(2)进行代价更新,更新后的匹配代价作为继续向下一个像素传播,重复该过程。

要求解(1)式,可以把它近似看成在多个1D方向上的聚合, 就可以近似求解这个问题了。要注意的是:

  • 代价聚合的方向一般要不少于8个,每个像素最终的代价是所有方向相加的结果。
  • 随着代价聚合的进行,匹配代价会很大造成具体实现时的数据溢出,一般会在代价聚合的时候减去当前像素所有匹配代价中的最小值,对于这个例子来说就是减去11.这个操作对应sgm论文中的公式(13)。
  • p1,p2的选取可以根据具体的应用进行调整,一般p1是一个定值,p2可以随着图像梯度变化而变化,往往要保证p2>=p1
  • 时间复杂度是o(whd)

C.视差计算

代价聚合后,选择每个像素处最小的代价所对应的深度作为该像素的深度,至于亚像素级的深度预测,使用二次曲线进行拟合。

论文后面部分还讲了multi-baseline情况的处理、视差图优化,以及视差图融合等内容,直接利用sgm算法计算出的深度图一般是有很大噪声的,后面的视差图的优化和融合在实际应用中是一个非常重要的部分,不过我认为这些优化和融合策略可以根据自己的具体应用去设计,论文的后面的部分这里不再讨论。

总结:sgm算法重建精度还可以,非常适合cuda加速,加速之后速度可以很快,缺点是有些细小的物体可能不太容易建出来,由于算法是基于前向平行假设的,与成像平面非平行的平面重建的不是太好,尤其是与与成像平面垂直的平面。

 

这篇关于Stereo Processing by Semi-Global Matching and Mutual Information基础算法解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695404

相关文章

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php