半全局立体匹配算法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. 10.2-linux文件与目录管理

    1.1-目录的相关操作 . rm Remove (unlink) the FILE(s). -f, --force #强制删除 ignore nonexistent files, never prom ...

  2. BUUCTF | [SUCTF 2019]CheckIn

    感觉这题师傅们已经写得很详细了,我就做一个思路梳理吧,顺道学一波.user.ini 步骤: 1.上传一个“.user.ini”文件 2.上传自己的马“a.jpg” 3.菜刀连接 "http: ...

  3. HTTP协议之-URL

    一.URL url统一资源定位符 1.URL格式: 方案.就是指所使用的协议,类似http:// 服务器的地址,类似i.cnblogs.com/ 制定web服务器的某个资源路径 方案://服务器位置/ ...

  4. 讨论Spring整合Mybatis时一级缓存失效得问题

    问题 1.学习测试时发现了一级缓存并没有生效,先看案例: setting配置: <settings> <!-- (1) 提供可控制Mybatis框架运行行为的属性信息 --> ...

  5. 原生js深拷贝函数

    function deepClone(data){ if(!data || !(data instanceof Object) || (typeof data=="function" ...

  6. selenium:Xpath定位详解

    xpath定位在业界被戏称为元素定位的"屠龙宝刀",宝刀在手,武林我有.现在我们就来详解xpath定位方法. 一.xpath通过元素属性定位 xpath可以通过元素的属性来定位,如 ...

  7. bash 中的特殊变量

    bash 中的特殊变量 变量 说明 ------------------------------------ $0 当前脚本的文件名 $n 第n个位置参数 $* 传递给脚本或函数的所有参数,$*会将这 ...

  8. 50-python基础-python3-列表-函数sorted() 对列表进行临时排序

    sorted()函数对列表进行临时排序,返回排序后的列表: 区别列表方法sort()原地修改,无返回值. 1-要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted() . 2 ...

  9. 重读ORB_SLAM之LocalMapping线程难点

    1. 认清几个锁与布尔参数 线程的通信与相互影响在ORB比较复杂,需要好好缕清思路. 1.1 mbStopRequested,由RequestStop函数设定,主要是在回环线程里,在运行全局优化时,以 ...

  10. Springboot2.x整合Redis(一)

    备注: springboto整合redis依赖于spring-boot-starter-data-redis这个jar 一,项目环境和依赖 1.POM.xml配置 <parent> < ...