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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines