基于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生不如死。。。。。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
SGM(Semi-Global Matching)是一种双目立体匹配算法,可以实现深度图的计算。下面是用Matlab实现SGM双目立体匹配算法的步骤: 1. 首先,准备好左右两幅图像,将其转换为灰度图像。 2. 对图像进行预处理,包括去噪和图像增强等操作。可以使用Matlab图像处理库中的函数,例如`medfilt2`进行中值滤波。 3. 为了计算视差图,需要定义一些参数,如最小和最大视差范围、惩罚权值等。可以根据具体需求进行调整。 4. 创建一个与原始图像大小相同的代价立方体(cost cube)。代价立方体是一个三维数组,第三维表示视差范围内的像素,用于存储每个像素与其他视差下像素的代价值。初始时,将代价立方体的所有元素初始化为一个较大的值。 5. 计算每个像素与其他像素的代价值。使用代价度量方法,例如绝对差异(absolute difference)或归一化相关(normalized correlation)。遍历图像的每个像素及其相邻像素,计算其代价值,并将其保存到代价立方体中。 6. 进行代价聚合。首先,创建一个与代价立方体相同大小的聚合立方体(aggregate cube)。然后,从左到右遍历图像,对每个像素计算最小代价路径。在计算路径时,考虑了代价立方体中当前像素和左边紧邻像素的代价。 7. 进行路径平滑。为了进一步减少噪声,可以对路径进行平滑操作。这可以通过计算上一步中找到的路径的正向和反向平均值来实现。 8. 计算视差图。根据路径聚合立方体,可以找到每个像素的最优视差,并将其保存到视差图中。 9. 可以对视差图进行后处理,例如中值滤波或双边滤波,以进一步减少噪声。 10. 最后,根据视差图可以计算深度图。深度值可以通过相机的基线、焦距等参数进行计算。 以上是使用Matlab实现SGM双目立体匹配算法的基本步骤。不同的应用可能会有一些不同的细节处理,可以根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张Tt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值