sgm立体匹配的六连击

各位好,今天咱们聊聊SGM立体匹配的六连击。事情还得从2008年的CVPR说起,虽然那时候我刚入门,感觉这玩意像个“高冷学霸”,读不懂、写不全,后面处理全靠挑着做。直到最近又把这篇经典论文完整啃完,才发现它其实挺亲民。作者给咱们准备好了三大假设,就像三把钥匙,把弱纹理、视差优化和平行近似这些“保险箱”依次给咱们打开了。咱们按“框架—代价—聚合—视差—优化—填充”这六步,把这经典套路好好拆解拆解。 先说说这三大假设,它们是算法的“压舱石”。虽然不能说是绝对真理,但在多数场景下是行得通的,给后续优化铺好了路。第一点是弱纹理区不存在视差非连续,说白了就是颜色差别不大的地方视差应该是连续的。像那种纯黑纯白的区域因为没纹理就别算了,得有一点能看得见的纹理才行。第三点说的是表面能近似成平面,圆柱圆锥这种可能会出bug的情况先不管它,反正室内的墙面地板够平。 有了假设就得去干正事。首先得用Mean-Shift算法把影像切成好多个子块Si,每个块里像素颜色都差不多。OpenCV里的例子很清楚,红点聚在一块儿的地方就是颜色同质区。太小的碎块直接扔了不浪费算力,剩下的大块就是咱们的优化目标。 然后在每个大块Si里面继续找视差连通块Sik,这是像素视差相近标签也一致的密集区域。要是块里啥都没找到也别慌,就按第二个假设来办:既然没可见纹理算法直接“罢工”,规则透明咱们心里都有数。 接下来就是平面拟合了。既然假设表面是个平面,咱们就对每个Si里的所有Sik分别拟合个平面Fik。能量函数Eik设计得很巧妙:Eik等于λ乘上残差再加上1减λ乘上差值。这个λ用来权衡平滑和忠诚度,论文默认是0.5。找到能量最小的平面就是最优的视差平面,剩下的无效像素视差值都按这个方程算出来。 最后一步是把结果写回原图去修复。遮挡的地方按以前讲过的规则标记出来;没遮挡的弱纹理块直接用平面外推值填进去;边缘和交界处留着原来的结果不动,免得过度平滑把细节抹掉。 这就好比从假设到分割再到拟合填充,SGM用一套看似简单的流程把立体匹配里最难啃的“硬骨头”——弱纹理给解决了。它虽然不是完美无缺的但路子很正:先降维再升维,用平面近似代替三维非线性优化,既保了速度又守住了精度。学会这招再遇到灰白墙、镜面、玻璃这类“送分题”,你也能让算法稳稳当当交卷了。 这次分享就到这儿了!