双目立体匹配
好久没有更新和视觉相关的内容了,相信小伙伴们已经等呆好久了。
立体匹配是立体视觉研究中的关键部分(双目匹配与深度计算(三角化),直接法中也有一定关系)。其目标是在两个或多个视点中匹配相应像素点,计算视差。通过建立一个能量代价函数,对其最小化来估计像素点的视差,求得深度。如图:双目视差与深度的关系
极线约束:所谓极线约束就是说同一个点在两幅图像上的映射,已知左图映射点p1,那么右图映射点p2一定在相对于p1的极线上,这样可以减少待匹配的点数量。
①根据算法运行时约束的作用范围:分为局部(local)匹配算法和全局(Global)匹配算法。
②基于生成的视差图:可分为稠密(Dense)匹配和稀疏(Sparse)匹配。
稠密匹配:是基于生成的视差图,对于所有像素都能生成确定视差值,称为稠密匹配。
稀疏匹配:只选择关键像素点[通常为角点或者边缘点]计算视差值的方法称为稀疏匹配,该算法计算速度较快,但后续还需要通过插值算法计算缺失像素点的视差值,因此应用场景上有很大限制。
3.1 全局匹配:
其中数据项
描述了匹配程度,平滑项
体现了定义场景的约束,C是匹配代价,P是不同两像素p和q视差的函数,一般称之为惩罚项(penalty),当p点和q点视差不相等时,P>0,且与两者差值越大,P值越大。当p和q视差相等时,P=0。由于全局匹配算法在数学上是一个能量函数的优化问题,因此可以找到最优解。这个问题被证明在二维空间是NP困难的。因此,即使全局算法具有准确性较高的优点,其计算速度确非常慢,在实时性要求高的场合不适合使用全局立体匹配算法。
3.2 局部匹配:
局部立体匹配算法又称基于窗口的方法或基于支持区域的方法。算法对参考图像中的每个像素计算一个合适大小、形状和权重的窗口,然后对这个窗口内的视差值进行加权平均。理想的支持窗口应该完全覆盖弱纹理区域,并在窗口内深度连续。与全局立体匹配算法相似,通过优化一个代价函数的方法计算最佳视差。但是,在局部立体匹配算法的能量函数中,只有基于局部区域的约束数据项,没有平滑项。局部匹配算法仅利用某一点邻域的灰度、颜色、梯度等信息进行计算匹配代价,计算复杂度较低,大多实时的立体匹配算法都属于局部立体匹配的范畴,但局部立体匹配算法对低纹理区域、重复纹理区域、视差不连续和遮挡区域匹配效果不理想。
3.3立体匹配算法步骤
1)匹配代价计算(Cost Computation):
计算匹配代价,即计算参考图像上每个像素点IR(P),以所有视差可能性去匹配目标图像上对应点IT(pd)的代价值,因此计算得到的代价值可以存储在一个h*w*d(MAX)的三维数组中,通常称这个三维数组为视差空间图(Disparity Space Image,DSI)。匹配代价时立体匹配的基础,设计抗噪声干扰、对光照变化不敏感的匹配代价,能提高立体匹配的精度。因此,匹配代价的设计在全局算法和局部算法中都是研究的重点。
2)代价聚合(Cost Aggregation)
通常全局算法不需要代价聚合,而局部算法需要通过求和、求均值或其他方法对一个支持窗口内的匹配代价进行聚合而得到参考图像上一点p在视差d处的累积代价CA(p,d),这一过程称为代价聚合。通过匹配代价聚合,可以降低异常点的影响,提高信噪比(SNR,Signal Noise Ratio)进而提高匹配精度。代价聚合策略通常是局部匹配算法的核心,策略的好坏直接关系到最终视差图(Disparity maps)的质量。
3)视差计算(Disparity Computation):
局部立体匹配算法的思想,在支持窗口内聚合完匹配代价后,获取视差的过程就比较简单。通常采用‘胜者为王’策略(WTA,Winner Take All),即在视差搜索范围内选择累积代价最优的点作为对应匹配点,与之对应的视差即为所求的视差。即P点的视差为
4)后处理(Post Process)
一般的,分别以左右两图为参考图像,完成上述三个步骤后可以得到左右两幅视差图像。但所得的视差图还存在一些问题,如遮挡点视差不准确、噪声点、误匹配点等存在,因此还需要对视差图进行优化,采用进一步执行后处理步骤对视差图进行修正。常用的方法有插值(Interpolation)、亚像素增强(Subpixel Enhancement)、精细化(Refinement)、图像滤波(Image Filtering)等操作。
①最常见的三种匹配代价为绝对差值和(Sum of Absolute Differences,SAD)、截断绝对差值和(Sum of Truncated Absolute Differences,STAD)、差值平方和(Sum of squared Differences, SSD)。
注意:式中N(p)表示p的支持窗口,当N(p)退化为只含有p点时,即逐像素计算匹配代价。这三种匹配代价对曝光强度变化非常敏感,对相机内参和曝光非常敏感(LSD-SLAM直接法的缺点)。计算上述匹配代价的时间复杂度为O(w*h*N(p)),可以使用积分图(Integral Image)或方框滤波(Box Filtering)的方法使时间复杂度下降到O(w*h)。
②Z.Gu最早提出将Rank变换函数引入到立体匹配中,与其他相似性测度相比,Rank变换对图像噪声和立体图像的亮度差异不那么敏感,且计算快,实时性好。Rank变换函数公式如下:
③census代价是充分考虑了图像局部相关的特性,而不是直接使用灰度值做差,具有抗光影畸变的作用,效率高、稳定性强,其核心思想与LBP算法的思想相近,是一种非常有效的代价计算方法。Census匹配代价计算如下:
其中HAMMING(a,b)用来计算二进制序列a和b的海明距离(Hamming Distance),可以用异或操作计算。seq[I(P)]函数根据p点像素值和p的支持窗口内像素值生成一个二进制序列。
④另外常用的匹配代价还有归一化互相关NCC(Normalized Cross Correlation)、BT代价函数(S.Birchfield & C.Tomasi)等。
归一化互相关NCC:
代码参考:
https://blog.csdn.net/chuhang_zhqr/article/details/51179881
https://blog.csdn.net/u010369450/article/details/78787805
参考博客:
https://www.cnblogs.com/ding-jing/p/8654137.html