欢迎收看长篇小说SGM第七章:弱纹理优化

码上教学系列

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

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

如前所述,SGM是一个优化的算法,源自两篇优秀的论文,作者Hirschmüller在2005年于TOP期刊PAMI上第一次发表SGM算法,又在2008年的顶会CVPR上再次发表,而CVPR上发表的和此前PAMI上的区别就在于增加了很多后处理步骤,博主自第五篇开始介绍的内容都来自于2008年的论文。很惭愧,博主自2014年开始接触SGM,开始并没有有完全读懂,后处理部分只是选择性的实现几项并再未静下心来认真阅读原文,直至今日,才对2008年的论文有一个完整的了解,感觉再次收货良多,如重拾旧友,倍感亲切。

本篇所介绍的内容是SGM后处理的其中一步:弱纹理区视差优化。如不出意外的话,本篇是手把手SGM教学的最后一篇,至此,原文中的所有模块都实现完成。当然,博主也不打算立Flag说肯定是最后一篇,万一后面心血来潮做一个额外的补充岂不是打脸。

【博主最近实在太忙,所以没时间写代码,但是手实在痒,所以决定先把理论讲一讲,后面再补代码】

【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化

  • 三个假设
  • 亮度一致性分割
  • 弱纹理区视差优化
  • 实验结果

三个假设

在弱纹理优化之前,作者提出三个假设,这三个假设至关重要,它是优化方法的理论依据,我们来看看原文如何描述:

  1. Discontinuities in the disparity image do not occur within untextured areas.
  2. On the same physical surface as the untextured area is also some texture visible.
  3. The surface of the untextured area can be approximated by a plane.

我来翻译一下:

  • 1)弱纹理区域不存在视差非连续。
  • 2)弱纹理区域内应该存在一些可见的纹理。
  • 3)弱纹理区所表示的表面能够用一个平面近似。

我将untextured翻译成弱纹理而非无纹理,我想作者讨论的应该是弱纹理,而无纹理是属于弱纹理的极端情况。

我们来逐个分析这三点假设,

1)弱纹理区域不存在视差非连续。

此假设在多数情况下成立,视差非连续往往会存在图像亮度的变化,比如前景和背景会因为离相机的距离不同而导致辐射强度不同,在图像上表现出亮度的差异,有了亮度的明显差异就不再属于弱纹理的范畴(弱纹理就是因为亮度差异太小而无法区分)。因此弱纹理区域内可以假设视差都是连续的。
【图】
但少数情况此假设会失效,有些情况前背景确实在图像上是同一亮度值,比如前后两块白墙,就可能在图像上都是无法区分的白色,这属于少数情况。
【图】
作者在此建立多数情况成立的假设,显然是无意提出适用于所有情况的完美解决方案,难度确实太大,而适应多数情况的解决方案是更合理且有效的。

2)弱纹理区域内应该存在一些可见的纹理。

此假设是必要假设,原因很简单,弱纹理区内若完全无纹理,则不可能估计正确视差,譬如左右视图上同一块区域都是全黑或者全白,实在想不出有什么办法可以正确估计视差。

这个假设很关键,弱纹理区域内有一些可见纹理所表达的背后含义是:可见纹理像素可以正确的计算出视差,从而为区域内其他像素的视差计算提供重要信息,这也是文章中弱纹理视差优化的前提,后面我们细说。

3)弱纹理区所表示的表面能够用一个平面近似。

此假设是三个中最弱的假设,该假设的理由是:非平面的表面往往会在图像上表现出亮度的变化。这个理由不一定成立,空间中的一个圆柱面也可能在图像上表现成连续的弱纹理块。但该假设也有很多正确的场景,比如多数结构化场景中,墙面、地面等都都是平面,在图像上常常表现成一大块弱纹理区域,符合该假设。

综上所述,三个假设所针对的是:空间中的平面在图像上呈现出一块亮度一致的弱纹理区域的情况。如果符合此种情况,则可基于上述三个假设采用文章中的优化方法来优化。

亮度一致性分割

弱纹理区视差优化的第一步是检测弱纹理区。弱纹理区的一大特征就是在图像上色彩(亮度)及其相近。

SGM作者采用Mean-Shift分割算法对影像进行分割,Mean-Shift是非常出名的图像分割算法,它的原理博主就不细说了,简单的说它把颜色相近的区域划分为同一子块,从而把图像分割成多个子块的算法。博主贴一些Mean-Shift的实验图同学们感受一下(来自opencv的meash-shift算法):

看到这里,大家可能会心里有点想法了,肯定是利用块内的好结果来修正差结果,就是不知道具体细节,那我们再继续往下分析。

首先,我们把分割结果每一块记为SiS_iSi​(i=0...Ni=0...Ni=0...N,NNN为分割快数),把面积小于阈值(论文推荐值:100)的块丢掉,因为小面积的弱纹理区域SGM处理的还不错,不需要做优化。

其次,我们把每一块内的视差连通块,记为SikS_{ik}Sik​,表示图像块SiS_iSi​内的第kkk块视差连通块。

不得不说,SGM对这种极弱纹理的数据结果真是太辣了。当然其他算法也不会太好,毕竟是立体匹配的疑难杂症。如果能处理好弱纹理,对室内的图像三维重建是不错的突破。现在室内都是Kinnect等主动式深度采集设备的天下。

有同学就举手问:要是图像块内完全没有视差块呢?这就要回到我们前面的假设2了:弱纹理区域内应该存在一些可见的纹理。有可见纹理SGM便能在纹理位置估计出有效视差。什么?完全没有?对不起,你破坏了我的假设,我不考虑,就是这么傲娇!

好了,标记工作完成,接下来就是对弱纹理区域做视差优化了。

弱纹理区视差优化

图像分成一块块了,每块内的视差也分成块了,接下来该怎么做?

轮到我们的假设3登场:弱纹理区所表示的表面能够用一个平面近似。

所以我们一个图像块就是一个平面对不对,一个平面的视差也是一个平面(这简单的推理留给大家)。所以思路就是:寻找图像块SiS_iSi​内的最优视差平面,然后基于平面方程计算块内无效像素的视差。

而寻找块SiS_iSi​内的最优视差平面的方法就是对块内的所有视差块都分别拟合一个平面FikF_{ik}Fik​,然后基于每个FikF_{ik}Fik​计算块内所有像素的视差,之后计算块SiS_iSi​的能量值EikE_{ik}Eik​,取能量值最小的平面FikF_{ik}Fik​为最优视差平面。
能量值计算公式

计算出块SiS_iSi​的最优视差平面后,便可通过平面公式计算出块内非遮挡无效像素的视差值。非遮挡像素的判断规则上一篇博客有讲解。最后的优化公式如下:

实验结果

【代码暂缺,实验结果暂缺,后补】

理论恒叨系列

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

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

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

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

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

个人微信:

欢迎交流!

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

【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化相关推荐

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

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

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

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

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

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

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

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

  5. 【码上实战】【立体匹配系列】经典SGM:(6)视差填充

    科学是一个精益求精的过程. 码上教学系列 [码上实战][立体匹配系列]经典SGM:(1)框架与类设计 [码上实战][立体匹配系列]经典SGM:(2)代价计算 [码上实战][立体匹配系列]经典SGM:( ...

  6. 【码上实战】【立体匹配系列】经典AD-Census: (1)框架

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

  7. 【码上实战】【立体匹配系列】经典AD-Census: (6)多步骤视差优化

    同学们好久不见! 下载完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论! 在实战的上一篇,我们对AD- ...

  8. 【码上实战】【立体匹配系列】经典PatchMatch: (1)框架

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

  9. 【码上实战】【立体匹配系列】经典PatchMatch: (4)代价计算

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

最新文章

  1. 棋盘格氧化铝标定板漫反射不反光12*9方格视觉光学校正板
  2. 三分钟学会用SpringMVC搭建最小系统(超详细)_转载
  3. 针对测试行业,新人的一些建议:我适合做测试吗?
  4. Docker日志日期时间精确查询
  5. 如何向IPython Notebook中导入.py文件
  6. 边缘化搭建DotNet Core 2.1 自动化构建和部署环境(上)
  7. Java性能调优调查结果(第二部分)
  8. 春Phone计划 51cto沙龙郑州站活动
  9. 腾讯云服务器获取root权限(ubuntu系统)
  10. 麦乐积分:积分兑换系统对于积分运营的重要性
  11. 第十七届全国大学智能车竞赛百度智慧交通组获奖名单
  12. 私钥,公钥的区分——私钥公钥讲解
  13. GRANT ALL PRIVILEGES
  14. 医院绩效考核上报工作迫在眉睫,如何顺利完成?
  15. 用opencv和vc++6.0开发的五子棋游戏软件
  16. python生成二维码的库——qrcode
  17. python利用ElementTree读写xml
  18. i9x系列是服务器CPU吗,i9-10920X和i9-10940X性能实测 CPU性能并不算十分令人满意
  19. Mysql优化之GROUP BY语句优化
  20. JavaScript define

热门文章

  1. Unity编程有限状态机的实现
  2. Spark Core笔记
  3. Windows下通过Kitematic创建mysql instance
  4. c语言printout函数,excel printout使用方法
  5. 基于SonarQube代码质量检测
  6. 【if 的高阶用法练习题】if + 形容词
  7. 什么是CAS?CAS有什么缺点?
  8. 2021黑龙江副高考试成绩查询时间,什么时候可以查黑龙江2021年高级经济师考试成绩-黑龙江高级经济师考试成绩查询时间 - 希赛网...
  9. 如何选择适合你的兴趣爱好(三十八),爵士舞
  10. 看疫情之下服装企业如何顺势而为