理论恒叨系列

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

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

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

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

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

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

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

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

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

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

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

式2 SGM能量函数表达式

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

式3 P2的调整式

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

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

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

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

式5

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

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

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

图3 路径聚合示意图

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

从公式5及6以及路径数不超过16可以很容易推导出S≤16(Cmax+P2)S≤16(C_{max}+P2)S≤16(Cmax​+P2),这个不等式很重要,它表明选择合适的P2P_2P2​值可以将聚合代价值SSS控制在一定数值范围内,减少聚合代价数组对内存的占用。如采用基于5×5窗口的Census变换的方法计算得到的匹配代价值CCC最高不超过25(因为Census变换后的比特串最大有效长度为25),则匹配代价只需用一个字节来存储,而当P2≤65535/16−25P_2 ≤ 65535/16-25P2​≤65535/16−25时,SSS可以只用两个字节来存储,因为存储代价的CCC和SSS空间大小是W×H×DW×H×DW×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.csdn.net/rs_lys

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

  1. 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)

      半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...

  2. 【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换

    理论恒叨系列 [理论恒叨][立体匹配系列]经典SGM:(1)匹配代价计算之互信息(MI) [理论恒叨][立体匹配系列]经典SGM:(2)匹配代价计算之Census变换 [理论恒叨][立体匹配系列]经典 ...

  3. 【理论恒叨】【立体匹配系列】经典AD-Census: (1)代价计算

    下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上 ...

  4. 【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)

    下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上 ...

  5. 【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型

    一枝独秀不是春 理论恒叨系列 [理论恒叨][立体匹配系列]经典PatchMatch: (1)Slanted support windows倾斜支持窗模型 [理论恒叨][立体匹配系列]经典PatchMa ...

  6. 【码上实战】【立体匹配系列】经典SGM:(2)代价计算

    码上教学系列 [码上实战][立体匹配系列]经典SGM:(1)框架与类设计 [码上实战][立体匹配系列]经典SGM:(2)代价计算 [码上实战][立体匹配系列]经典SGM:(3)代价聚合 [码上实战][ ...

  7. 【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2

    昔人已乘黄鹤去,此地空余黄鹤楼. 2020对武汉.对中国.对世界来说是异常艰难的一年.武汉壮士扼腕,封一城而救一国,引得八方救援,举国抗疫.中国人在灾难面前总是空前团结,勇往直前!中华民族几千年来从未 ...

  8. 【码上实战】【立体匹配系列】经典SGM:(5)视差优化

    千呼万唤始出来,犹抱琵琶半遮面. 抱歉让大家久等,最近事儿繁多,导致更新推迟,实在抱歉. 码上教学系列 [码上实战][立体匹配系列]经典SGM:(1)框架与类设计 [码上实战][立体匹配系列]经典SG ...

  9. 【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计

    前言 一直就想做这样的专题,因为自己是一名算法工程师,而算法落地对算法工程师来说是职责和能力之体现,前面有一个专题是专门介绍Semi-Global Matching(SGM)双目立体匹配算法的理论知识 ...

最新文章

  1. .NET工程师必须掌握的知识点
  2. php订单系统 帝国cms,帝国CMS商城系统在线支付后,订单邮件提醒
  3. 都在说TDD开发,那到底TDD是什么?
  4. 华为云提供针对Nuget包管理器的缓存加速服务测试
  5. QTP和WinRunner区别
  6. 每天10分钟就能练出流利口语
  7. linux内核 块驱动程序,linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?...
  8. LeetCode 278. First Bad Version
  9. 集合系列之fail-fast 与fail-safe 区别
  10. 计算机二级vb大题,全国计算机等级考试二级vb操作题最后一道大题题库
  11. Scratch 怪兽动画+骨骼矢量素材编程素材免费下载!
  12. NTFS,exFAT,FAT32最详细的评测
  13. 算法特训营第2周刷题题目
  14. Mock.mock()生成模拟数据
  15. PyCharm连接MySQL数据库的时候,驱动下载失败
  16. service mysqld restart与service mysql restart的区别
  17. python读取docx文件出错_Python:读取 .doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误...
  18. WeinView 与 MITSUBISHI FX 系列 PLC 通讯范例
  19. oracle中redo的作用,深入浅出Oracle:Redo的作用
  20. 【Java】网络编程——TCP/UDP网络对讲机

热门文章

  1. 苹果手机不震动了是怎么回事_苹果手机通话音量小是怎么回事呢?
  2. Heterogeneous Graph Transformer(中文翻译助理解)
  3. python手记(12)
  4. 亚马逊云科技 Build On 2022 - 参加一场动手实验是怎样一种体验?
  5. Jenkins 镜像无法更新插件中心的3种解决方法
  6. visualVM安装插件,无法连接到visualVM 插件中心
  7. 【报告汇】三公里社区争夺战——2021年社区团购研究报告-202102.pdf(附下载地址)
  8. 【经典卷积神经网络CNN模型 之 VGG16Net】模型实验,强烈建议使用GPU来跑,经试验,若使用CPU,普通PC理论上需要超过100小时
  9. R&S,数通HCIE|MPLS虚拟专用网跨域(一)
  10. 腾讯手游助手android版本过低,腾讯手游助手电脑版存储空间不足什么意思