文章目录
- 前言
- 一、SGM是什么?
- 1.代价计算
- 2.代价聚合
- 3.视察计算
- 4.视察优化
- 二、基于python实现SGM算法?
- 总结
前言
开始正是入门立体匹配算法啦,会不断更新立体匹配的算法和代码。
水平有限,旨在先了解和读懂别人的代码的实现方式,和大家交流互相学习,自己用代码实现的话,…emmm…水平有限,可能还有点困难,大家一起努力呀。
参考文章:计算机视觉方向简介 | 半全局匹配SGM
【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
【立体匹配】Stereo Processing by Semiglobal Matching and Mutual Information(SGM)
一、SGM是什么?
SGM原文下载链接:Stereo Processing by Semiglobal Matching and Mutual Information
SGM算法是Heiko Hirschmu¨ller提出的半全局匹配算法,是一种介于局部匹配与全局匹配之间的匹配算法,一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况下并不成立导致匹配效果较差;而另一方面全局算法虽然通过二维相邻像素视差之间的约束(如平滑性约束)而得到更好的匹配效果,但是对内存的占用量大,速度慢。其较好的中和了局部匹配和全局匹配的优缺点,在精度和效率上有较好的平衡。
1.代价计算
SGM采用的是基于互信息匹配代价(MI,Mutual Information)。互信息是一种对影像明暗变化不敏感的相关性测度,它通过两张影像各自的熵H 以及两者的联合熵来定义,熵代表影像的信息量,是基于灰度的概率分布所得到的统计量,图像的熵越大代表包含的像素灰度越丰富,灰度分布越均匀。
基于互信息的匹配代价计算公式:
2.代价聚合
由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,增加一个额外的约束,通过惩罚临近视差的变化来保证平滑。
C为匹配代价,公式的第一项是数据项,表示当视差图为D时,所有像素的匹配代价的累加,第二项和第三项是平滑项,表示对像素p 的Np邻域内的所有像素q进行惩罚,其中第二项惩罚力度较小(P1较小),对相邻像素视差变化很小的情况(1个像素)进行惩罚;第三项惩罚力度较大(P2>P1),对相邻像素视差变化很大(大于1个像素)的情况进行惩罚。
为了保护真实场景中的视差非连续情况,P2 往往是根据相邻像素的灰度差来动态调整。
上式中能量函数的最优化是一个NP问题,故而SGM提出了一个思路,即将像素所有视差下的匹配代价进行像素周围所有路径(比如8或者16)上的一维代价聚合,然后再将所有的一维代价聚合值相加,以近似二维的最优,这不仅可以取得和全局算法相媲美的结果,还大大的增加了效率。
论文中16个方向上的代价聚合。
3.视察计算
在SGM算法中,视差计算采用赢家通吃(WTA)算法,每个像素选择最小聚合代价值所对应的视差值作为最终视差,视差计算的结果是和左影像相同尺寸的视差图,存储每个像素的视差值。
4.视察优化
视差优化则是对计算得到的视差图进行进一步的优化,包括剔除粗差,亚像素插值,平滑等等。比如经常使用的左右一致性检查,可用来剔除遮挡点所产生的错误匹配,对视差图的改进比较大。
二、基于python实现SGM算法?
借鉴github上大佬的SGM实现算法,已经整理好,直接替换图片就可以运行啦!
点击下载 :基于python实现的SGM半全局立体匹配算法
总结
看了相关文章,只能怪自己数学功底太弱,手撕SGM生不如死。。。。。