《On Building an Accurate Stereo Matching System on Graphics Hardware》论文笔记
@(sinbad)[[email protected]]
简要记录下ADCensus算法的流程步骤,以便日后记忆。
现今Stereo matching算法大致可以分为三个部分: pre-process 、stereo matching 、post-process。
pre-process即为USM图像增强,直方图归一化或直方图规定化。
post-process即为常规的disparity refinement,一般stereo matching算法出来的结果不会太好,可能很烂,但经过refinement后会得到平滑的结果。
Step 1. ADCensus 代价计算
ADCensus = AD+Census
AD即 Absolute Difference
Census Feature原理很简单,在指定窗口内比较周围亮度值与中心点的大小,匹配距离用汉明距表示。Census保留周边像素空间信息,对光照变化有一定鲁棒性。论文说立体匹配中对无纹理区域有改善效果。
两者信息结合作者用到了一个函数
Step 2. Cross-based 代价聚合
本篇文章最有特色的是自适应窗口代价聚合,号称可以取代传统耗时的分割方法。
Cross-based代价聚合为分自适应窗口的构建和代价聚合两步。
构建窗口:
对于点p,在设定的最大窗口范围内搜索,满足下面三个约束条件确定每个像素的十字坐标,完成自适应窗口的构建。
代价聚合计算需要先水平后垂直共4次的原因刚开始觉得构建区域不变,两轮计算重复了,后来查看源代码才真正理解。
迭代4次的正确理解为:对所有像素点水平边界计算一次cost累加(1次完成);对所有像素点垂直边界计算cost累加一次(2次完成);对所有像素点垂直边界计算cost累加一次(3次完成);对所有像素点水平边界计算一次cost累加(4次完成)。 发现两次cross-based region 形状是不一样的。所以为什么改变聚合方向顺序会有不一样的结果。
Step 3. Scanline 代价聚合优化
Scanline方法文章改进的是smi-global matching的能量函数求解方法,只是将原来的8个方向减少到4个方向,重新看下SGM原理便不难理解,SGM能量函数在二维图像中寻找最优解采用了分而治之的方法,分为8或4个一维问题。下面分析下从左到右方向的一维动态规划问题。
理解:每一个点的代价聚合值是“当前代价+min(路径相邻点的当前视差代价聚合值,路径相邻点的视差差值为1的代价聚合值 + P1,路径相邻点的视差插值大于1的最小代价聚合值 + P2)- 路径相邻点的视差插值大于1的最小代价聚合值 ”,听起来够绕口的,其实就好比最小代价的蔓延,当前代价聚合值由当前代价和路径上一点的加了惩罚的最小代价聚合值所决定(最后那一项纯粹是为了防止数字过大,这是常用手段)。引用这篇博文的解释
Step 4. 多种Refinement
Outlier Detection
: 跟传统的左右一致性检查一样,对于左右一致性约束条件不满足
条件的异常点被分为遮挡点和误匹配点,其中对于异常点p的左视差Disp(p),如果极线范围内右Disp(p)被check则该点定义为误匹配点,否则该点为遮挡点。
Iterative Region Voting
: 传播异常视差点
这里再次用到cross-based自适应窗口,对于异常视差点p,统计窗口内所有有效视差点构成直方图Hp,如果满足下面条件
其中,表示直方图内最高投票所在d值,表示
对于预定的阀值,不断传播进入遮挡区域,并将覆盖后的点标记点“有效点”迭代参与下次异常点投票过程中。
Proper Interpolation
: 根据异常点分类采取不同的修复方式
大体可以理解为对于遮挡点,该点来自背景的可能性比较大,采用周围16点相邻点视差最小值进行填充;否则采用相邻颜色相似度最高点的视差值进行填充。
Depth Discontinuity Adjustment
: 非连续视差适应,先求下边缘检测,对于视差值在边缘上的点p找到边缘两侧点p1, p2,该点视差 取这两个侧点中代价最小的那个视差值。该方法可以减少非连续性错误。
Sub-pixel Enhancement
: 二次线性插值
最后常规添加一个中值滤波。