这篇博客主要介绍一下自己对立体匹配文献《Spatial-Depth Super Resolution for Range Images》一文的理解,本文是杨庆雄的又一篇经典文章,发表于CVPR2007,引用次数颇高。再加上,当时在是《Stereo Matching Using Tree Filtering》看到的引用,十分好奇,所以拿来说说自己的分析,与大家分享。
(转载请注明:http://blog.csdn.net/wsj998689aa/article/details/49464017, 作者:王嗣钧)
1. 相关概念
我当时对“Range Image”的理解有误,我以为它指的是视频的连续帧图像,其实它的意思就是深度图像,并且特指通过深度相机(例如,TOF相机)采集到的深度图像。但是为什么要这么设计名词,我就不清楚了,这个单词在立体匹配中出现的频率并不是很高,作为文章标题就更少了。”Spatial-Depth“一般翻译成为空间深度,这篇文章标题的另一种翻译就是《对深度图进行上采样》,通过这个标题我们就会很清楚作者的意图:给定一个低分辨率视差图,通过本文提出的算法,将低分辨率视差图上采样成为高分辨率视差图。
这个标题说明,CVPR也看重具有工业应用的想法,正如CVPR2015发布的google的一篇文章,关于手机的散焦处理的,还是一篇Oral,所以大家要是有什么专利级别的点子,也可以写成论文试一试。
至于为什么要将低分辨率深度图上采样为高分辨率深度图,原因其实很简单,就是为了一个速度,正如之前的博客分析的一样,想得到高精度的视差图依赖于复杂的全局算法,非常耗时,距离实时应用还有很大的距离,于是作者另辟蹊径,直接通过对低分辨率深度图上采样,达到精度还不错的高分辨率视差图,这是一个具有开创性的想法。自恋的说一下,当时在做立体匹配的时候,我也冒出过这样的想法,但是马上就发现了这篇论文,汗!!!看来我们这种小菜鸟能想得到的,早就被各种大牛想到并实现了,所以做人还是低调点好。。。。
2. 算法思想
本文的算法思想可以用一句话概括:结合硬件采集的低分辨率视差图以及高分辨率原图,利用双边滤波对低分辨率视差图进行上采样,得到与原图同等分辨率的视差图。文章提供了一个很好的阐述算法思想的流程图,如下所示:
1). 我们先对低分辨率视差图进行上采样,当然,这样的视差图一定很挫。
2). 我们再根据上采样得到的大视差图,计算代价体(cost volume),其实就是代价计算项(参考DoubleBP)。
3). 根据得到的cost volum,利用双边滤波对其进行处理,得到更好的cost volum。
4). 基于更好的cost volum,用WTA(牛逼哄哄的胜者为王算法),得到视差图。
5). 还没完,对得到的视差图进行亚像素求精。
6). 尽情的迭代,到爽为止!!!
算法思想很简单吧?但是为什么这么做,却是最重要的。以及耳熟的双边滤波究竟是何方神圣,这些真的得好好地说一说,请听下节分解。
3. 算法核心
3.1 代价体
一般经过上采样的视差图,通过插值,在低纹理区域往往能够得到相对精确的效果,但是物体边缘就不是这样了,往往十分模糊,如图所示:
本文就是针对这种上采样之后效果不佳的物体边缘像素视差值进行迭代求精处理,首先,基于D0计算代价体:
这是一个截断二次函数,作者之所以用二次函数的原因得好好说说,这个二次函数中的d是候选视差,D是当前得到的视差图,意义就是二者差距越大,代价值就越大,言外之意就是每次迭代,通过WTA选择的视差不会和当前视差差距太大(我只选最小的,那肯定是接近于当前视差的),只是小修,不是大修。
3.2 双边滤波
滤波算法中,目标点上的像素值通常是由其周围的一个局部区域中的像素所决定,例如可以基于像素之间的灰度值或位置关系。图像的滤波算法有很多种,高斯滤波,gabor滤波等等,每种都有自己的特点,例如最简单的高斯滤波,其只考虑了图像的空间位置信息,根据像素与中心像素的距离远近,计算像素的权值,高斯滤波对图像所有区域都“同等对待”,模糊了纹理的同时也模糊了边缘。而双边滤波却不是这样,它不仅考虑到了像素之间的位置关系,还考虑到了像素之间的颜色差异,这样就使得双边滤波是一种“边缘保持(Edge-Preserving)”的滤波方法,仅对非边缘区域进行较大程度的模糊,针对边缘由于考虑到了像素之间的颜色的差异,和边缘颜色相近的像素能够得到较大的权值,和边缘颜色不相似的像素只能够获得较小的权值,自然使得边缘一侧的像素权值较小,对边缘的干扰作用也随之减弱。滤波之后,边缘的颜色还是之前的颜色,只有微微的模糊。
个人感觉,高斯滤波是要营造一种“蒙太奇”的效果,亦真亦幻;双边滤波就是美图的效果,消除美女脸上的细小皱纹,年轻十岁。。
本文利用双边滤波对粗糙的代价体进行处理,目的也是将代价体弄得平滑一些,将野值代价体尽可能去除。然后就可以进一步根据平滑之后的代价体进行代价聚合,最后利用WTA求取视差值了。
下面是最重要的问题,为什么将双边滤波用在了代价体上?
回答:我们仔细想想看,代价聚合和图像滤波其实是一样的,代价聚合是什么?根据目标像素周围或全图的像素计算得到的权值,对目标像素的代价值重新进行更新。这和图像滤波是一样的方法,具体说,和线性滤波是同样的方法,双边滤波就是一种代表性的线性滤波,具有边缘保持的特性,所以作者直接将同一视差d的各个像素的代价值视为一幅代价图,对这幅代价图进行双边滤波处理,其实就是代价聚合,代价聚合能够很好的保证代价值的真实性,这就是为什么双边滤波要用在代价体上的原因。
有朋友肯定也会想到,那双边滤波为什么不用在视差图上?
回答:原因很简单,这个时候没有靠谱的视差图可用,用了双边滤波效果肯定不好。
3.3 亚像素求精
但是本文的重点不是这里,重点在求出视差值之后的“亚像素求精”,大部分的立体匹配算法都可以进行亚像素求精,至于为什么要进行亚像素求精?那是由于整数级别的视差值计算出来的深度值不会精确到哪里去(用公式算算就知道了,如果基线距离过大),如果我们想求取精确的深度信息,那么亚像素求精是最简单有效的方法。本文采用的方法就是传统的二次多项式插值,这里很有意思。
因为我们得到的视差值都是离散的,并且是整数,举个例子,如果我们通过WTA得到一点的视差值是10,以及对应的代价值30,我们同时也可以得到视差9的代价值(假设是40),视差11的代价值(假设为50),我们可以利用二次多项式函数(如下所示)来计算浮点型的视差值,
注意这里面的参数有a,b,c共三个,所以我们要想求解这三个参数,就需要3个方程,根据上面的(,10, 30)、(9, 40)、(11, 50),我们就可以求解出这个多项式的最小值,这个最小值就是所谓的多项式差值,最小值的公式如下:
这就是亚像素求精的全部内容,这样的方法可以应用在任何一种立体匹配算法上,非常通用,我认为这一步是非常重要的,尤其在我们要基于视差图进行进一步分析的时候,整形的数据往往误差太大,果断弄成浮点型的数据。文中称为离散和连续,一个意思。亚像素求精之后效果明显,如图所示,
注:在DoubleBP的改进算法SubpixDoubleBP中,在计算完每个像素点的亚像素之后,还要进行均值滤波,在9*9的窗口中。
4. 结论
这篇文章被应用在了DoubleBP上,被称为SubpixDoubleBP,亮点是基于双边滤波对代价体进行处理,应用于视差图上采样,提出亚像素求精的概念及其方法,是一篇给力的好文!分析不对的地方,还请朋友们指正哈