半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况下并不成立导致匹配效果较差;而另一方面全局算法虽然通过二维相邻像素视差之间的约束(如平滑性约束)而得到更好的匹配效果,但是对内存的占用量大,速度慢。为了结合两者的优点,同时避免两者的缺点,SGM算法依旧采用全局框架,但是在计算能量函数最小化的步骤时使用高效率的一维路径聚合方法来代替全局算法中的二维最小化算法,使用一维最优来近似二维最优,得到的视差图在效果上和全局算法没有太大的差别,但是算法效率却有非常大的提升。接下来的几篇博客将从匹配算法的四个步骤出发,来对SGM算法做一个详细介绍。
本篇首先介绍SGM算法第一步:匹配代价计算 的典型算法之一:基于互信息(Mutual Information,MI)的匹配代价计算法。
基于互信息的匹配代价计算
从上一篇文章中可知,匹配代价计算是双目立体匹配的第一步,在双目匹配算法中,大部分算法会为每个像素预先设置一个固定的视差搜索范围D(dmin ~ dmax),将像素的视差真值限定在范围D内,并引入一个大小为W×H×D的三维代价空间C,C中的每个元素映射左影像每个像素在视差范围内每个视差下的匹配代价值,而匹配代价计算即是通过计算像素之间的相关性来填充C的步骤,计算的时间复杂度为O(W H D)。
在SGM被提出的文献 中,Hirschmüller使用基于互信息(Mutual Information,MI)的匹配测度计算算法来计算匹配代价,互信息是一种对影像明暗变化不敏感的相关性测度,它通过两张影像各自的熵H以及两者的联合熵来定义,熵代表影像的信息量,是基于灰度的概率分布所得到的统计量,图像的熵越大代表包含的像素灰度越丰富,灰度分布越均匀。互信息MI通过公式1来计算,
式1
其中, 为图像I和I的互信息,H 、H 分别为I、I的熵, H为两张图像的联合熵。图像的熵及联合熵通过灰度的概率分布P计算,计算公式分别如公式2及3所示。
式2
式3
对于两幅配准好的影像来说,它们的联合熵是很小的,因为其中一张影像可以通过另外一张影像预测,这表示两者的的可区分度很低,所包含的信息很少,而由公式1可知它们的互信息会相对更大,这也是互信息可以作为相关性测度的理论依据,当两者的相关性越高,则互信息越大。
在使用互信息的立体匹配中,首先必须将其中一幅图像根据视差图进行纠正,使得同名点在两张图像中处于同一位置,假设基准影像为I,匹配影像为I,则纠正方式可表示为
式4
公式1是针对全图计算互信息的公式,而不是像素之间独立计算,无法直接用于匹配代价计算,Kim等使用泰勒展开方法将联合熵的计算转换为通过数据项累加的方式,数据项的计算依赖于同名点对且对每个像素独立,如公式5所示,
式5
其中,数据项 h通过左右影像同名点灰度的概率分布 来计算,若影像内同名点数为n,通过基于高斯卷积g(i,k) 的Parzen窗估计法来计算数据项,见公式6:
式6
上式中,i, k为参与计算数据项的两个灰度,它们的联合概率分布使用公式7计算
式7
其中,T函数若其参数为真,则返回1,反之返回0,实际上就是统计灰度对与(i, k)相同的同名点对在全图中所占的比例。
Kim等人认为基准影像的熵H是固定的,而匹配影像的熵H也基本是固定的因为纠正函数f(I)只不过是对匹配影像的灰度进行了重新位置分配,但是由于有遮挡的存在,基准影像被遮挡的区域没有正确的视差值,这些区域也就不存在同名点,不能参与熵计算,而由于这些区域的位置是无法预先被告知,所以只能认定两张影像的熵都是不固定的,因此一般来说,采用计算联合熵相类似的方式来计算影像各自的熵,如公式8所示:
式8
概率分布的计算需要遍历全图,但只需要统计同名点对所在的区域。实际上P(i)可以直接使用联合概率分布来计算,即
式9
最终,互信息的定义可以用公式10来描述:
式10
基于互信息的匹配代价可通过公式11来计算:
式11
其中,q表示像素p的同名点。
从以上描述可以看到,要计算互信息,必须预先知道视差图来对匹配影像进行纠正,这仿佛类似于鸡生蛋蛋生鸡的问题,论文中采用的是一种分层迭代的方案,对影像进行逐级降采样得到多层影像对,为最上层影像对随机生成一张视差图,然后计算得到的代价数组作为初始代价数组计算新的视差图并作为下一层影像对的视差图,如此迭代至最下层影像,一般迭代三次即可达到较好的匹配结果。
互信息法代价计算原理较为复杂,且计算需要迭代,计算效率不高,在实际应用中,更简单有效的方法如Census变换、BT法会得到更多的青睐。下一篇中,将为大家详细介绍实用高效且简单易懂的Census变换法。
查看下篇Census变换法请点击>> link