立体匹配之SGM算法简述
1、概述
看了
李博
的立体匹配SGM算法理论部分系列文章,觉得受益匪浅,为了具体梳理一下思路,因此简单记录一下。
2、算法步骤
2.1 匹配代价计算
-
使用
Census变换
计算每个像素的二进制比特串。主要思想就是设计一个以某个像素为中心的5*5或是更大窗口,通过比较像素值的大小,获得每个像素的二进制比特串。感觉有点像ORB特征点中的FASt角点判断方式,以及BRIEF描述子的形成形式。 -
在使用立体匹配算法前需要使用
立体校正
的方式对左右图像进行校正,使得其极线处于水平位置,便于视差的查找。 - 立体校正之后,左右图像的视差可以表示d=xl-xr。由于左图看到的点一般在右侧,右边看到的对应点一般在左侧,因此d>0,否则的话共视范围太小,不利于视差图的求解。
- 假设左图中某个点的视差范围D为:最小视差(0)~最大视差(64)之间。对每一个视差值,通过左右图像对应点的二进制比特串,计算其汉明距离(也就是比特串中对应位不相同的数量)作为该视差值得匹配损失。
-
所有计算完成后,得到一个图像宽W × 图像高H × 视差范围D的损失代价矩阵,用于后续的代价聚合使用。这里借用原文中的一张图表示一下汉明距离的计算:
2.2 代价聚合
-
在图像中,某个点的视差不仅与其对应的匹配点有关,还与其周围的像素点有关。因此为了保证视差值的正确性与连续性,根据前面的代价值,通过
代价聚合
的方式对视差进行优化。 - 对于某个像素点的聚合代价的主要是通过各个方向的代价之和进行计算,一般使用4领域聚合即可达到较好的视差优化效果,包括上、下、左、右四个方向。
-
对于每一个方向的代价值,可以通过下面的式子(取自
代价聚合
)进行计算:
公式中p代表像素,r代表路径,左右路径的情形下,p−r就是p左侧(从左到右聚合)或者右侧(从右到左聚合)的相邻像素,他们行号相等,列号相差1。L是聚合代价值,C是初始代价值。
2.3 视差计算与优化
- 前面计算了每个像素在视差为最小视差(0)~最大视差(64)之间时各个视差值的匹配代价值,那么其具体的视差值就是最小代价值对应的视差值。
-
视差计算完成后,需要对其进行
视差优化
,包括:
(1)
左右一致性检查
:即通过左图像的视差图,获得右图像的视差图,对于视差图中的匹配点,如果在左图中的视差值与其在右图中的视差值小于1个像素,那么该视差计算正确,否则删除改点对应的视差值。
(2)
唯一性检测
:是指对每个像素计算最小代价和次最小代价的值,若两者相对差小于一定阈值,则被剔除。
(3)
剔除小连连通区
:是指剔除掉视差图中连通的极小块区域,同一个连通区内的视差与邻域视差之差小于设定阈值(一般为1)。
(4)
提高视差精度
:采用二次插值的方式,对最优视差的代价值以及前后两个视差的代价值进行二次曲线拟合,曲线的极值点所对应的视差值即为新的子像素视差值。
(5)
中值滤波
:对视差图进行滤波。
3 总结
参考李博立体匹配系列博客:
【恒叨立码】【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
【恒叨立码】【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation
【恒叨立码】【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化
版权声明:本文为qq_38589460原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。