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

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

1.它是NLCA的变种。

2.它是CVPR的文章。

本文还是从Segment-Tree的算法思想,算法核心,算法效果三方面进行分析,这篇文章的源代码链接是(http://www.cv-foundation.org/openaccess/content_cvpr_2013)

1. 算法思想

Stereo Match是前段时间一直研究的问题,我将主要的精力都集中在了半全局算法上,或者带有非全局性质的局部算法,如上一篇博客介绍的non-local cost aggregation,本文介绍一下NLCA的衍生品,这样说没有冒犯作者的意思哈!但是segment tree确实是基于NLCA的改进版本,本文的算法思想是:基于图像分割,对每个分割求取NLCA子树,然后根据贪心算法,将各个分割对应的子树进行合并,算法核心是其复杂的合并流程。但是这个分割不是简单的图像分割,其还是利用了最小生成树(MST)的思想,对图像进行处理,在分割完毕的同时,每个分割的MST树结构也就出来了。然后将每个子树视为一个个节点,在节点的基础上继续做一个MST,所以号称分层MST,还是比较贴切的!

算法是基于NLCA的,那么ST和NLCA比较起来好在哪里?作者给出的解释是,NLCA只在一张图上面做一个MST,并且edge的权重只是简单的灰度差的衍生值,这点不够科学,比如说,当遇到纹理丰富的区域时,这种区域会导致MST的构造出现错误,其实想想看的确是这样,如果MST构造的不好,自然会导致视差值估计不准确。而ST考虑了一个分层的MST,有点“由粗到精”的意思在里面。有图说明:

a指的是原图,b指的是局部放大图,c指的是ST的权重图,d指的是NLCA的权重图,这个权重图指的是,周围点对红色点的贡献度,越亮代表权重越大。可以明显看到,在对细节的处理上,ST明显强于NLCA,表现在ST中p1点位于低纹理区域,对高纹理区域的贡献很低很低,这更符合理想状态。但是MST却有瑕疵,绿色三角指向的地方就是瑕疵所在。

产生上述现象的原因就在于,ST在生成MST的同时,事实上也对各个区域生成了MST,这样便使得单点对其他点的权值,在所位于区域内比较大, 而在不同的区域上往往很小。至于ST是如何做到的,请看下一小节中的解释。

2. 算法核心

本文的核心部分就是其中的流程图,最让人费解的也是这个算法流程,所以本小节重点说一下我对这块的理解。它将流程分为三个部分,初始化->聚合->连接

其实,该算法流行直接采用了文献《Efficient graph based image segmentation》中提到的全局分割方法,文献在这里并没有进行过多的解释,只是一再强调可以去文献中查阅这篇文章。下面说一下各个步骤的含义。

1. 初始化很简单,边先暂且不考虑,将每个像素点形成一个集合T,集合内只有一个像素点。

2. 聚合比较复杂,需要将边根据权值由小到大排序,然后对所有的边进行遍历,与边相伴随的两个点要么合并,要么不合并,判断的准则就是边权值是否满足下述条件:

如果合并,那么就要将边不断的添加到集合E‘中,最终,E’中存放的都是小树中的边,由于后续还需将每个小树视作一个个节点,重新将小树连接成为一棵大树,所以需要将E‘从E中删除。

3.剩下的就是连接,正如上面所说,连接就是将每个小树视作节点,进一步形成一颗大树。采用的方法和上面的步骤很相似,对E中的边进行遍历,这个时候没有条件的限制,如果两个小树不同就得合并,直至E’中边的个数只比点的个数少1,因为树的边数就比节点数少1个,所以这里意味着全图对应的还是只有一颗MST,注意,这个E‘没有重新被清空。

流程就是上面说的这样,下面提几个问题:

1)流程图中合并的集合一直都是Vp,Vq,那么Vp,q是怎么处理的?

2)为什么聚合之后,就相当于对图像进行了分割?

3)终止条件有什么意义在里面?

4)边权值满足的阈值有什么意义?

以下部分是我的回答:

1). 要回答这个问题,我们不妨思考一下MST的创建过程,你就会发现,原来这个流程图和MST的区别只有一处,那就是“选择edge的时候,多了一个判断条件”,其余的真的是一模一样,作者故意将流程图分为三部分,使其看的复杂,其实完全可以说“我们的算法流程就是普通的基于克鲁斯卡尔创建MST + edge判断条件”,这很滑稽,也是各国论文中无处不在的猫腻。回到正题,Vp,q变成了一个连通,仅此而已,在代码上只要写parent(Vp)
= parent(Vq)即可。说白了,作者忘了多提一句Vp = Vp,q

2). MST创建的时候,只要发现一个edge两个端点所属的连通不一样,就要将两个连通合并为一个连通,这里面的连通就可以理解为这里的子树,而ST会考虑edge两个端点所在连通的区别大小,区别不大就合并,区别大就不合并,你懂了吧?这样就会将图像自然的分成一个个区域,因为你有的区域不合并嘛!

但是,说句心里话,我觉得作者虽然一直强调ST有这么优秀的性质,但是并没有给出严格意义上的证明啥的,只是根据直觉,这有点不靠谱,至少我在做视差图的时候,发现视差图并没有体现出区域分割的优势。所以我觉得在此处有过度包装的嫌疑。

3). 终止条件中的Int(Tp)其实是一种区域内间距的定义,而k/|Tp|就是一种调节因子。这直接借鉴了图像分割中一类方法(基于图表示的图像分割),它定义了区域间间距区域内间距两种距离度量,如果区域间间距大于区域内间距,那么两个区域就不能合并,反之就可以合并,公式中的边权值w,由于是从小到大排列的,刚好就是区域间间距的意思。

(关于基于图表示的图像分割方面的内容,网上博客也有很多,,大家可以去科普一下这方面的知识。我就找到了《Efficient Graph-Based Image Segmentation论文思路》一文,介绍的就不错。)

4). 如果是不同的图像区域,MST的做法对区域没有任何辨识能力,有的区域之间差距很明显,有的区域之间差距不明显,但是MST一视同仁,而ST却不是,它提出了一个判断条件,满足这个条件的不同区域,我可以合并,不满足就不合并!阈值就是干这个的。

3. 算法效果

论文中给出了算法的视差图对比,当然对比的对象就是NLCA,以及双边滤波方向的方法Guided Filter,从标准数据集上看,其实ST和NLCA真的差距不是很大,并且标准数据集上的比较并没有很强的实际一起,往往在middlebery上好的评测算法,在实际应用场景上,效果就是个渣渣。。。但是ST是一种代价聚合方法,其实很多全局算法之所以求得精确,就在于它们在视差求精阶段做足了文章,其实它们的代价聚合步骤得到的视差往往不咋地,那么完全可以基于ST进行视差求精,这才是ST最大的意义啊!

4. 结论

之所以研究ST,主要还是因为它是NLCA的扩展,是一种非传统的全局算法,与NLCA唯一的区别就在于ST在创建MST的时候,引入了一个判断条件,使其可以考虑到图像的区域信息。这点很新颖,说明作者阅读了大量的文章,并且组合能力惊人,组合了MST和基于图表示的图像分割。它的运行时间虽然比NLCA要大一些,但是相比较全局算法,速度已经很可以了。

但是算法也有一些缺陷,首先,算法对图像区域信息的考虑并不是很严谨,对整幅图像用一个相同的判断条件进行分割,分割效果不会好到哪里去,并且基于实际数据实测,会发现总是出现“白洞”的缺陷,这也是区域信息引入的不好导致的。虽然在细节上略胜于NLCA,但是算法耗时也有所增加。上述原因也是本文引用率不佳的原因。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 07:39:04

《Segment-Tree based Cost Aggregation for Stereo Matching》读后感~的相关文章

大道至简第五章读后感

第五章 失败的过程也是过程 今天照样老师带领着我们阅读了大道至简第五章,阅读了<大道至简>的第五章,这章在前面的基础上又进了一步,有了技术和团队,加上有效的沟通,接下来就要接项目做工程. “虚有其表耳”,本章以<明皇实录>中的一句话来告诉我们一个深刻的道理:不要只求外表,只做形象工程,而是要透过表象,力求实质. 失败了不要紧,没有失败也就找不到自己的不足,也就不会发现自己的问题,更不用谈改进了.我们的前辈们就是在不断的失败中才总结出了“瀑布模型”“螺旋模型”等模型,方便了我们.但是

大道至简 第五章读后感

第五章 失败的过程也是过程 以得失而论,在瀑布模型与RUP模型之间,学习前者而不成,可思过程的本质:学习后者而不成,可得文字的架子. 如果懂得了所谓的模型原本都演化自那个简单的瀑布,那么文档是按XP写还是按RUP写,也就可以应时.应需,因地置宜,择善而从了. 越是简单的东西,往往越是接近于本质. 项目经理的工作,就是要去组织这个工程中的各个角色,使得分工明确,步调一致,共同地完成这个项目.四川有句地方话叫“做过场”,也有说成“走过场”的.“过场”是舞台术语,意思是角色从舞台一端出场,再走到另一端

大道至简 第五章 失败的过程也是过程 读后感

今天该写一写大道至简第五章读后感了. 首先是“做过程不是做工程”,过程是为了实现某种目的而经历的一些事情,过程有很多种,虽然经历了某种过程,但不一定能实现某种功能.做完过程的每一个阶段,并不等于做工程.做过程不是做工程的精义,也不是最终目的. 然后是“做过场”,做过场就好像是一种形式一样,做了没必要做的事情,就是浪费时间. 我们为什么做工程,不要忘了最终目的.目的,是实现客户的要求,工程只是一种实现的途径.最初做开发的前辈们,不用什么工程或者过程,也一样编出了程序,也一样解决了问题,也一样实现了

大道至简第七章读后感

大道至简第七章读后感——现实中的软件工程 “王不如远交而近攻,得寸,则王之寸:得尺,亦王之尺也.”——<战国策.秦策> 1:大公司手中的算盘 文中列举了IBM,Borland和Microsoft的一些体系,来说明大公司眼中的世界. 大公司们在标准.理论.语言上的争来夺去,未必全然出于“软件实现”的考虑.对统一理论.统一工具.统一过程的企图,其最终目的是在整个软件工程体系中的全面胜出.算 盘 上 的 绝 大 多 数 人 , 只 是 用 于 计 算 胜 负 的 一 枚 算子.所谓编程语言,只不过是

大道至简第五章阅读感想

第五章失败的过程也是过程 今天王建民老师依旧带领着我们阅读了大道至简第五章,第五章是失败的过程也是过程.通过前面的技术.团队和沟通,这章主要讲了关于做工程的问题. 文章开篇以一句<明皇实录>中的“虚有其表耳”来说明一个很重要的问题就是:不能只求外表,而是要透过表象,力求实质. 第五章的整体思想是让我们注重过程,因为有很多人从来不注重过程,只注重结果.然而过程对于一个编程人员也是非常重要,如果一个好的编程员从来不在乎程序的过程,只是关心最后程序是否能够实现,那么这个编程员一定不是一个好的编程员.

大道至简 第六章 读后感

说点什么呢,今天看了看大道至简第六章<从编程到工程>. 文章以<列子·说符>的“得其精而忘其粗,在其内而忘其外:见其所见,不见其所不见,视其所视,而遗其所不视.”为题记.第一节讲了“语言只是工具”,作者讲述了他曾经对一些编程语言的看法.他曾经也热衷于讨论语言的优劣,但是他现在不这样了,他已经不再专注于语言, 正如他在第一章中写到的一样:成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的.确实,程序的好坏不在于语言,在于算法. 第二节又写了“程序”,程序=算法+结构,编程的精义于此

《大道至简》第一章读后感

经常听见有人抱怨编程太难,说自己不是学软件的料,那么他们真该好好看看<大道至简>这本书,相信他们看完这本书后会有很大收获. <大道至简>第一章引用了一个很简单的故事“愚公移山”,用这个故事很好的概述了我们在完成一个项目时所要进行的步骤.听上去“愚公移山”和编程简直是风马牛不相及,但是看过作者的叙述又有原来如此的感觉.其实编程并没有什么难懂的,就和我们日常生活一样,发现问题,分析问题,提出解决问题的方案,实施,和后续的验收.例如某天我们突然发现家里放不出水了,这就是发现问题,我们会观

大道至简第三章读后感

---恢复内容开始--- 大道至简第三章的是团队的问题.我们知道,随着人们生活水平的不断提高,用户对计算机软件的功能要求也日趋上升.这样一来,计算机软件就变得越来越复杂,规模变得越来越庞大,源代码的量也越来越多.在这种市场需求和自身发展的共同要求之下,一个团结而高效的开发团队的作用就不言而喻了.那么如何打造一支强有力.听指挥.能干活的开发团队呢?这一章作者就这个问题和我们展开了讨论. 作者着重的强调了项目经理在开发团队中的作用.首先声明一点,这并不是说团队的开发人员不重要,作者从始至终都认为编程

一切都是为了实现-大道至简第六章读后感

大道至简第六章的内容比较多,也比较深.或者说这一章作者是从一个更高的层次.更开阔的视野.更独特的角度来解读软件工程这四个字的具体含义的. 作者的这些肺腑之言都是作者在软件行业工作了多年之后总结出来的.开发技术对一个软件产品质量的好坏和最终的成功的影响并虽然不能说是一点也没有,但也不是很大.真正起到决定性因素的不是那些技术细节,而是一个高度过程化.通晓方法论.拥有大量工具的开发团队或者是开发公司.在这个团队里面,无论是对项目经理还是开发经理甚至是一个普通的开发人员的要求都是很高的.团队内的每个人必

《大道至简》第一章读后感和伪代码

阅读了<大道至简>第一章,感到作者对编程的精义分析非常具体形象,引用<愚公移山>的故事,说明了编程的本质.又将他们扮演的管理者,技术人员,程序分析师众多形象展现出来.又在困惑人们的"我能不能学会编程"这一问题做出回答,作者列举生活实例,给出了肯定的答案,将很多抽象的东西,简单化,通过最常见的生活中的实例介绍"大道". import java.大道至简.*; public class.yishan.*; { public static void