半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况下并不成立导致匹配效果较差;而另一方面全局算法虽然通过二维相邻像素视差之间的约束(如平滑性约束)而得到更好的匹配效果,但是对内存的占用量大,速度慢。为了结合两者的优点,同时避免两者的缺点,SGM算法依旧采用全局框架,但是在计算能量函数最小化的步骤时使用高效率的一维路径聚合方法来代替全局算法中的二维最小化算法,使用一维最优来近似二维最优,得到的视差图在效果上和全局算法没有太大的差别,但是算法效率却有非常大的提升。接下来的几篇博客将从匹配算法的四个步骤出发,来对SGM算法做一个详细介绍。

  本篇首先介绍SGM算法第一步:匹配代价计算 的典型算法之一:基于互信息(Mutual Information,MI)的匹配代价计算法。

基于互信息的匹配代价计算

  从上一篇文章中可知,匹配代价计算是双目立体匹配的第一步,在双目匹配算法中,大部分算法会为每个像素预先设置一个固定的视差搜索范围D(dmin ~ dmax),将像素的视差真值限定在范围D内,并引入一个大小为W×H×D的三维代价空间C,C中的每个元素映射左影像每个像素在视差范围内每个视差下的匹配代价值,而匹配代价计算即是通过计算像素之间的相关性来填充C的步骤,计算的时间复杂度为O(W H D)。

  在SGM被提出的文献1 2中,Hirschmüller使用基于互信息(Mutual Information,MI)的匹配测度计算算法来计算匹配代价,互信息是一种对影像明暗变化不敏感的相关性测度,它通过两张影像各自的熵H以及两者的联合熵来定义,熵代表影像的信息量,是基于灰度的概率分布所得到的统计量,图像的熵越大代表包含的像素灰度越丰富,灰度分布越均匀。互信息MI通过公式1来计算,

式1

  其中, 为图像I1和I2的互信息,HI1 、HI2 分别为I1、I2的熵, HI1,I2为两张图像的联合熵。图像的熵及联合熵通过灰度的概率分布P计算,计算公式分别如公式2及3所示。

式2

式3

  对于两幅配准好的影像来说,它们的联合熵是很小的,因为其中一张影像可以通过另外一张影像预测,这表示两者的的可区分度很低,所包含的信息很少,而由公式1可知它们的互信息会相对更大,这也是互信息可以作为相关性测度的理论依据,当两者的相关性越高,则互信息越大。

在使用互信息的立体匹配中,首先必须将其中一幅图像根据视差图进行纠正,使得同名点在两张图像中处于同一位置,假设基准影像为Im,匹配影像为Ib,则纠正方式可表示为

式4

  公式1是针对全图计算互信息的公式,而不是像素之间独立计算,无法直接用于匹配代价计算,Kim等3使用泰勒展开方法将联合熵的计算转换为通过数据项累加的方式,数据项的计算依赖于同名点对且对每个像素独立,如公式5所示,

式5

  其中,数据项 hI1,I2通过左右影像同名点灰度的概率分布 来计算,若影像内同名点数为n,通过基于高斯卷积g(i,k) 的Parzen窗估计法3来计算数据项,见公式6:

式6

  上式中,i, k为参与计算数据项的两个灰度,它们的联合概率分布使用公式7计算

式7

  其中,T函数若其参数为真,则返回1,反之返回0,实际上就是统计灰度对与(i, k)相同的同名点对在全图中所占的比例。

  Kim等人3认为基准影像的熵HI1是固定的,而匹配影像的熵HI2也基本是固定的因为纠正函数fD(Ib)只不过是对匹配影像的灰度进行了重新位置分配,但是由于有遮挡的存在,基准影像被遮挡的区域没有正确的视差值,这些区域也就不存在同名点,不能参与熵计算,而由于这些区域的位置是无法预先被告知,所以只能认定两张影像的熵都是不固定的,因此一般来说,采用计算联合熵相类似的方式来计算影像各自的熵,如公式8所示:

式8

  概率分布的计算需要遍历全图,但只需要统计同名点对所在的区域。实际上PI(i)可以直接使用联合概率分布来计算,即

式9

  最终,互信息的定义可以用公式10来描述:

式10

  基于互信息的匹配代价可通过公式11来计算:

式11

  其中,q表示像素p的同名点。

  从以上描述可以看到,要计算互信息,必须预先知道视差图来对匹配影像进行纠正,这仿佛类似于鸡生蛋蛋生鸡的问题,论文1中采用的是一种分层迭代的方案,对影像进行逐级降采样得到多层影像对,为最上层影像对随机生成一张视差图,然后计算得到的代价数组作为初始代价数组计算新的视差图并作为下一层影像对的视差图,如此迭代至最下层影像,一般迭代三次即可达到较好的匹配结果。

  互信息法代价计算原理较为复杂,且计算需要迭代,计算效率不高,在实际应用中,更简单有效的方法如Census变换、BT法会得到更多的青睐。下一篇中,将为大家详细介绍实用高效且简单易懂的Census变换法。

  查看下篇Census变换法请点击>> link


  1. HIRSCHMULLER H. Accurate and Efficient Stereo Processing by Semi-Global Matching and Mutual Information: Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on, 2005[C]. ↩︎ ↩︎ ↩︎

  2. HIRSCHMÜLLER H. Hirschmüller, H.: Stereo processing by semiglobal matching and mutual information. IEEE PAMI 30(2), 328-341[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2008,30(2):328-341. ↩︎

  3. KIM J, KOLMOGOROV V, ZABIH R. Visual Correspondence Using Energy Minimization and Mutual Information: IEEE International Conference on Computer Vision, 2003. Proceedings, 2008[C]. ↩︎ ↩︎ ↩︎

双目立体匹配经典算法之Semi-Global Matching(SGM)概述:匹配代价计算之互信息(Mutual Information,MI)的更多相关文章

  1. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

      由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示.聚合后的新的代价值保存 ...

  2. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:视差计算、视差优化

    文章目录 视差计算 视差优化 剔除错误匹配 提高视差精度 抑制噪声 视差计算   在SGM算法中,视差计算采用赢家通吃(WTA)算法,每个像素选择最小聚合代价值所对应的视差值作为最终视差,视差计算的结 ...

  3. 真实场景的双目立体匹配(stereo matching)以及虚拟视点合成(virtual view synthsis)示例

    双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图.而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可 ...

  4. Python3实现机器学习经典算法(三)ID3决策树

    一.ID3决策树概述 ID3决策树是另一种非常重要的用来处理分类问题的结构,它形似一个嵌套N层的IF…ELSE结构,但是它的判断标准不再是一个关系表达式,而是对应的模块的信息增益.它通过信息增益的大小 ...

  5. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  6. 超像素经典算法SLIC的代码的深度优化和分析。

    现在这个社会发展的太快,到处都充斥着各种各样的资源,各种开源的平台,如github,codeproject,pudn等等,加上一些大型的官方的开源软件,基本上能找到各个类型的代码.很多初创业的老板可能 ...

  7. Atitit 图像处理30大经典算法attilax总结

    Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...

  8. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  9. JS的十大经典算法排序

    引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...

随机推荐

  1. 微信小程序相关操作

    显示用户基本信息 在微信小程序中,经常会碰到需要展示微信用户的基本信息,如果只是为了显示用户信息,最简单有效的办法是使用open-data,这是微信小程序内置的用于展示微信开放数据的组件,通过改变ty ...

  2. loadrunner(预测系统行为和性能的负载测试工具)

    LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试.企业使用LoadRu ...

  3. spring boot项目打包成war

    一.修改打包类型 在pom.xml中修改 <packaging>war</packaging> 二.移除嵌入式tomcat插件,并以依赖方式引入 <dependency& ...

  4. BeautifulSoup的用法

    BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...

  5. nb哒LCA

    求欧拉序每log分一块每段找最小值共n/log块然后建st表,复杂度n/log*log = n每块记前后缀最小过至少一块很好求对于在一块的:由于欧拉序的标号前后只会相差1所以序列种类只有2^k种k&l ...

  6. 20150709---Web中GridView控件根据绑定的数据显示不同的图片

    示例图: 根据数据判断,显示各种不同的图片 该列的前端代码: <asp:TemplateField HeaderText="审图"> <ItemTemplate& ...

  7. Oracle 11g 概述

    始于:1970.6月份的一篇论文,IBM研究员埃德加‘考特<大型共享数据库的关系模型>(也是转折点)1977.6月Larry Ellison Bob Miner Ed Oates创办了“软 ...

  8. 开源 NAS 操作系统不完全汇总

    市面上能见到的 NAS 操作系统很多,有如 FreeNAS 这样意气风发的开源免费版,也有完全商业的闭源版本,更有如黑群晖之类的破解版本.NAS 系统的迭代是一个大浪淘沙的过程,活下来的系统在功能上逐 ...

  9. xshell的安装及连接linux的使用方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...

  10. HTML创建文本框的3种方式

    我的第一个随笔,记录主要用来整理学习的知识点 1.input 创建单行文本框 <input type="text" size="10" maxlength ...