立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结

时间:2022-11-10 05:55:50
http://www.cvpapers.com/cvpr2014.html上,搜索《Cross-Scale Cost Aggregation for Stereo Matching》找到相应的代码下载,在VS+openCV环境下运行,可以得到相应的深度信息图片。另外参考这两篇博客的内容,就可以理解这篇文章里提到的算法的基本思想了: http://blog.csdn.net/chuhang_zhqr/article/details/54316484 http://blog.csdn.net/wsj998689aa/article/details/44411215 本人刚接触计算机视觉不久,在学习这些优秀算法的同时,补充了一些该算法中涉及的基础知识,和大家分享,欢迎交流~
1.在程序整理框架学习中遇到的问题整理:

图像金字塔:

图像金字塔是通过将原始图像经过平滑、下采样所生成一系列具有不同分辨率的图像的集合。金字塔结构(Pyramid)适于多分辨率处理的一种图像存储数据结构

最常用的生成图像金字塔的方法是采用高斯函数平滑图像,每次将分辨率降低为原来的一半,由此得到一个图像序列{ML,ML-1,……,M0}.

对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像。降采样很容易实现. 

高斯金字塔:http://www.cnblogs.com/starfire86/p/5735061.html

高斯金字塔 :

对于高斯金字塔,很容易直观地理解为对同一尺寸的图像,然后进行不同程度的高斯平滑,这些图像构成高斯金字塔,这种是不对的,这描述的图像集合叫做一个八度。金字塔总要有个变“尖”的过程,真正的高斯金字塔要有个平滑以及下采样的过程,因此整个图像平滑以及下采样再平滑,构成的所有图像集合才构成了图像的高斯金字塔。

八度(octave) 简单地说八度就是在特定尺寸(长宽)下,经不同高斯核模糊的图像的集合。八度的集合是高斯金字塔。

其实以前对一幅图像的处理还是比较单调的,因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上,榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核,也就是说使用高斯核对图像模糊不会引入其他噪声,因此就选用了高斯核来构建图像的尺度。

高斯金字塔的构建步骤:

根据Lowe的论文,高斯金字塔的构建还是比较简单的,高斯卷积和是尺度变换的唯一的线性核。

高斯金字塔构建过程中,一般首先将图像扩大一倍,在扩大的图像的基础之上构建高斯金字塔,然后对该尺寸下图像进行高斯模糊,几幅模糊之后的图像集合构成了一个八度,然后对该八度下的最模糊的一幅图像进行下采样的过程,长和宽分别缩短一倍,图像面积变为原来四分之一。这幅图像就是下一个八度的初始图像,在初始图像图像的基础上完成属于这个八度的高斯模糊处理,以此类推完成整个算法所需要的所有八度构建,这样这个高斯金字塔就构建出来了。

什么是尺度空间:

怎么在高斯金字塔中,两个变量很重要,即第几个八度(o)和八度中的第几层(s),这两个量合起来(o,s)就构成了高斯金字塔的尺度空间。尺度空间也不难理解,首先一个八度中图像的长和宽是相等的,即变量o控制的是塔中尺寸这个尺度;区分同一个尺寸尺度下的图像,就需要s了,s控制了一个八度中不同的模糊程度。这样(o,s)就能够确定高斯金字塔中的唯一一幅图像了,这是个三维空间,两维坐标,一维是图像。

尺度空间是连续的。


2.在学习程序匹配代价内容时遇到的问题整理:

(1)加权最小二乘法(WLS)的基本思想:
它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

匹配代价计算——census变换:
选定一个窗口,对窗口中每一个像素与中心像素进行比较,大于中心像素即为0,否则为1。从而得到一个二进制系列,分别对左图和右图进行计算每个像素的匹配代价。并得到初步的代价聚合,计算每个像素在视差范围内每个可能视差的代价聚合值。左右匹配,即两个二进制系列相似值,每个对应位是否相等。

(2):TAD + 梯度
这个算法运用图像三通道颜色值的差的绝对值AD,结合一个阈值,做成TAD样式,求三通道均值; 然后利用参数为1的sobel算子求解x方向的图像梯度,同样加一个阈值,做成TGRD的样式。这两个特征进行加权相加。这里还对图像边缘进行判断,是边缘的话,就把左右TAD和TGRD的右换成边缘阈值
(3)sobel算子:
计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量.
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值.
(4)TAD法的相似度度量函数,该函数在自适应权重法中也有应用。

立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结

(5)线性滤波器:
boxfliter
主要功能是在给定的滑动窗口大小下,对每个窗口内的像素值进行相加求和。
guidedfilter引导滤波器
在引导图像的引导下对输入图像进行滤波,这种新型滤波器对边缘的保持很好,而且运行计算量和核的大小无关.


3.在学习程序代价聚合内容时的知识点总结:

代价聚合方式:
CAFilter:滤波的方法进行代价聚合(双边滤波器bilateral filter,引导滤波器guided image filter,box filter)
BilateralFilter:
双边滤波器就是对窗口内像素进行距离加权和亮度加权。双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,

立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结

Box Filter:主要功能是在给定的滑动窗口大小下,对每个窗口内的像素值进行相加求和,均值滤波的快速算法。
包滤波器的其主要功能是:在给定的滑动窗口大小下,对每个窗口内的像素值进行快速相加求和。
Boxfilter的初始化过程如下:
1、给定一张图像,宽高为(M,N),确定待求矩形模板的宽高(m,n),如图紫色矩形。图中每个黑色方块代表一个像素,红色方块是假想像素。
2、开辟一段大小为M的数组,记为buff, 用来存储计算过程的中间变量,用红色方块表示
3、将矩形模板(紫色)从左上角(0,0)开始,逐像素向右滑动,到达行末时,矩形移动到下一行的开头(0,1),如此反复,每移动到一个新位置时,计算矩形内的像素和,保存在数组A中。以(0,0)位置为例进行说明:首先将绿色矩形内的每一列像素求和,结果放在buff内(红色方块),再对蓝色矩形内的像素求和,结果即为紫色特征矩形内的像素和,把它存放到数组A中,如此便完成了第一次求和运算。
4、每次紫色矩形向右移动时,实际上就是求对应的蓝色矩形的像素和,此时只要把上一次的求和结果减去蓝色矩形内的第一个红色块,再加上它右面的一个红色块,就是当前位置的和了,用公式表示 sum[i] = sum[i-1] - buff[x-1] + buff[x+m-1]
5、当紫色矩形移动到行末时,需要对buff进行更新。因为整个绿色矩形下移了一个像素,所以对于每个buff[i], 需要加上一个新进来的像素,再减去一个出去的像素,然后便开始新的一行的计算了。

立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结

Open cv函数实现:
costVol[ d ] = BoxFilter( costVol[ d ], 3 );//实现7 x 7 box filter

GuiderFilter:

在引导图像的引导下对输入图像进行滤波,这种新型滤波器对边缘的保持很好,而且运行计算量和核的大小无关

立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结
该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。
同理,我们可以认为图像是一个二维函数,而且没法写出解析表达式,因此我们假设该函数的输出与输入在一个二维窗口内满足线性关系,如下:

立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结

其中,是I在窗口w_k中的平均值,是I在窗口w_k中的方差,是窗口w_k中像素的数量,是待滤波图像p在窗口w_k中的均值。
在计算每个窗口的线性系数时,我们可以发现一个像素会被多个窗口包含,也就是说,每个像素都由多个线性函数所描述。因此,如之前所说,要具体求某一点的输出值时,只需将所有包含该点的线性函数值平均即可,如下
立体匹配算法:《Cross-Scale Cost Aggregation for Stereo Matching》总结 这里,w_k是所有包含像素i的窗口,k是其中心位置。
当把引导滤波用作边缘保持滤波器时,往往有 I = p ,如果e=0,显然a=1, b=0是E(a,b)为最小值的解,从上式可以看出,这时的滤波器没有任何作用,将输入原封不动的输出。如果e>0,在像素强度变化小的区域(或单色区域),有a近似于(或等于)0,而b近似于(或等于),即做了一个加权均值滤波;而在变化大的区域,a近似于1,b近似于0,对图像的滤波效果很弱,有助于保持边缘。而e的作用就是界定什么是变化大,什么是变化小。在窗口大小不变的情况下,随着e的增大,滤波效果越明显。
在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。引导滤波最大的优势在于,可以写出时间复杂度与窗口大小无关的算法(打算在之后的文章中讨论),因此在使用大窗口处理图片时,其效率更高。