semi-global matching(SGM)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。
第一部分:SGBM算法原理:
一、预处理
Step1:SGBM采用水平Sobel算子,把图像做处理,公式为:
Sobel(x,y)=2[P(x+1,y)-P(x-1,y)]+ P(x+1,y-1)-P(x-1,y-1)+ P(x+1,y+1)-P(x-1,y+1)
Step2:用一个函数将经过水平Sobel算子处理后的图像上每个像素点(P表示其像素值)映射成一个新的图像:PNEW表示新图像上的像素值。
映射函数:
preFilterCap 为一个常数参数,opencv缺省情况下取15,例程中取63。
预处理实际上是得到图像的梯度信息,将预处理的图像保存起来,将会用于计算代价。
二、代价计算
代价有两部分组成:
1、经过预处理得到的图像的梯度信息经过基于采样的方法得到的梯度代价。
2、原图像经过基于采样的方法得到的SAD代价。
上述两个代价都会在SAD窗口内进行计算。
三、动态规划
动态规划算法本身存在拖尾效应,视差突变处易产生错误的匹配,利用态规划进行一维能量累积累,会将错误的视差信息传播给后面的路径上。半全局算法利用多个方向上的信息,试图消除错误信息的干扰,能明显减弱动态规划算法产生的拖尾效应。
半全局算法试图通过影像上多个方向上一维路径 的约束,来建立一个全局的马尔科夫能量方程,每个像素最终的匹配代价是所有路径信息的叠加,每个像素的视差选择都只是简单通过 WTA(Winner Takes All)决定的。多方向能量聚集如下图所示:
在每个方向上按照动态规划的思想进行能量累积,然后将各个方向上的匹配代价相加得到总的匹配代价,如下式所示:
式中L为当前路径累积的代价函数,P1、P2为像素点与相邻点视差存在较小和较大差异情况下的平滑惩罚,P1<P2,第三项无意义,仅仅是为了消除各个方向路径长度不同造成的影响。将所有r方向的匹配代价相加得到总的匹配代价,如下:
默认4条路径,其中动态规划很重要两个参数P1ÿ