Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

2018年11月05日 19:02:44 ethan_1990 阅读数:400

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rs_lys/article/details/83754473

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

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

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

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

其中,Edata为数据项,是反应视差图对应的总体匹配代价的测度;Esmooth是平滑项,为了让视差图满足某些条件假设的约束,如场景表面的连续性假设,平滑项会对相邻像素视差变化超过一定像素的情况进行惩罚(对应的能量函数具有较大的值),而图像边缘处像素例外,因为边缘像素被认为确实是视差非连续区域的概率较大。图2为视差连续区域与非连续区域示意图。

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

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

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

式2 SGM能量函数表达式

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

式3 P2的调整式

P2’为P2的初始值。

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

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

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

式5

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

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

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

图3 路径聚合示意图

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

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

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

原文地址:https://www.cnblogs.com/adong7639/p/10195968.html

时间: 2024-10-12 15:48:52

Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)的相关文章

《Segment-Tree based Cost Aggregation for Stereo Matching》读后感~

前段时间整理博客发现,自己关于立体匹配部分的介绍太少了,这可是自己花了一个季度研究的东西啊!读了自认为大量的文章,基本上有源码的都自己跑了一遍,还改进了多个算法.不写写会留下遗憾的,所以打算在立体匹配这一块多谢谢博客,一来用于分享,二来用于请教,三来用于备忘.本文介绍的文章就是CVPR2013的<Segment-Tree based Cost Aggregation for Stereo Matching>一文,介绍它原因有以下几点: 1.它是NLCA的变种. 2.它是CVPR的文章. 本文还

《A Non-Local Cost Aggregation Method for Stereo Matching》读后感~

最近一直在做stereo matching方向的研究,仔细研读了包括局部算法,全局算法,以及半全局算法三个方面的算法文献,对该方向有了比较清晰的了解,这次分享一下我对杨庆雄的经典文献<A Non-Local Cost Aggregation Method for Stereo Matching>(简称NL算法)的一些理解. 之所以想分享这篇文献,是因为文献明确抛弃了support window的算法思想,指出support window在视察估计上普遍具有陷入局部最优的缺陷,创新性的提出了基于

基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非局部代价聚类(non-local cost aggregation)的立体匹配,从题目上看这篇论文不是局部算法,但是也不是传统意义上的全局算法.这要从基于窗结构局部立体匹配算法说起,如下图: 我们求左右两幅图像在视差d下一点的cost时,我们实际是求得以该点为中心半径为r的Windows内所有点的c

从头认识java-6.1 聚合(aggregation)

我们来说一下复用类最简单的方法:聚合(aggregation) 其实说白了,就是建立了一个类,然后在其他地方引用来使用. package com.ray.ch05; public class Test { public static void main(String[] args) { } } package com.ray.ch05; public class Test2{ public static void main(String[] args) { new Test(); } } 建立了

Mongo散记--聚合(aggregation)&amp;amp; 查询(Query)

mongo官网:http://www.mongodb.org/ 工作中使用到Mongo,可是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充,达到总结备忘的目的. 本篇主要终结记录聚合和查询. 聚合(aggregation) Count db.view_view.count() db.view_view.count({_id:"521842"}) db.view_view.find().count() db.view_view.

Mongo散记--聚合(aggregation)&amp; 查询(Query)

mongo官网:http://www.mongodb.org/ 工作中使用到Mongo,但是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充,达到总结备忘的目的. 本篇主要终结记录聚合和查询. 聚合(aggregation) Count db.view_view.count() db.view_view.count({_id:"521842"}) db.view_view.find().count() db.view_view.

Ruby操作MongoDB(进阶八)-聚合操作Aggregation

上篇博文讲述了排序规则collations的操作和设置方式.顺带介绍了一部分聚合aggregation的设置方式.本文继续介绍聚合操作. 聚合框架的操作处理完数据记录后在返回计算结果.集合操作将来源于多个文档的值归类到一起,这样就可疑在被归类的数据上进行多种操作,然后返回一个单独的结果 1 聚合管道 聚合管道是用于数据聚合的一个框架,是以数据处理管道概念为原型.将文档输入一个多级管道后,可疑将文档转换为聚合的结果.下面以restaurants作为数据集,通过将餐馆类归类,我们就可以使用聚合管道在

ASP.NET MVC中的Global.asax文件

1.global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的. 因此在global.asax中的代码可以访问HttpApplication类中所有的public或者protected的成员global.asax不被用户直接请求,但global.asax中的代码会被自动执行来

mysql5.7 代价模型浅析

代价模型 mysql 5.7.10代价计算相对之前的版本有5.7 代价模型浅析较大的改进.例如 代价模型参数可以动态配置,可以适应不同的硬件 区分考虑数据在内存和在磁盘中的代价 代价精度提升为浮点型 jion计算时不仅要考虑condition,还要考虑condition上的filter,具体参见参数condition_fanout_filter 5.7 在代价类型上分为io,cpu和memory, 5.7的代价模型还在完善中,memory的代价虽然已经收集了,但还没有没有计算在最终的代价中.5.