文章目录

  • PatchMatch算法原理
  • PatchMatch算法详情
  • >深度图初始化
  • >patch初始化
  • >深度图传播优化
  • >深度图获取与优化
  • 参考文献与代码框架


PatchMatch算法原理

  以下图为例,ci,cj是一对图像的中心,p是ci上的一个像素点,在该点的viewray(ci,p)上找到一个平面使得与邻域帧cj的聚合代价最小,这个平面f2就是我们要重建的曲面的切平面。

python通过深度图像求目标距离值 图像深度算法_深度图

PatchMatch算法详情

>深度图初始化

  与SGM中深度图初始化一致,不再赘述。

>patch初始化

  利用上述初始化的深度图,我们初始化每个像素的patch平面(用3D点Xi和法向量ni表示,fp = [Xi,ni])。以下图为例,平面是在相机坐标系就是曲面的切平面。

python通过深度图像求目标距离值 图像深度算法_邻域_02

  平面参数Xi计算方式:

  

python通过深度图像求目标距离值 图像深度算法_邻域_03

  式中,K是相机内参,p是像素点坐标,d是p点的深度图。

  法向量ni计算:

  

python通过深度图像求目标距离值 图像深度算法_邻域_04

  上式中,是用以Ci为中心的球坐标系计算。

python通过深度图像求目标距离值 图像深度算法_python通过深度图像求目标距离值_05


  在这里,匹配代价计算方法采用的是基于权重的NCC算法,主要是参考两个因素:与邻域帧的灰度差、与邻域帧的像素距离。具体代价计算公式如下所示:

python通过深度图像求目标距离值 图像深度算法_深度图_06

>深度图传播优化

  迭代传播是重头戏,它的基本思想是把初始的所有视差平面中的正确的视差平面传播至同一视差平面内的其他像素。算法执行多次迭代,每次迭代执行四个步骤:(1)空间传播(Spatial Propagation);(2)视图传播(View Propagation);(3)时序传播(Temporal Propagation)。其中,偶数次迭代是从图像左上角像素沿行方向传播至右下角像素;奇数次迭代则和偶数次迭代传播顺序相反,即从右下角像素沿行方向传播至左上角像素。

python通过深度图像求目标距离值 图像深度算法_深度图_07


python通过深度图像求目标距离值 图像深度算法_三维重建_08

  1.空间传播:相邻像素很可能在同一平面,查找当前像素p的邻域像素q的平面fq是否更适合p。如果m(p,fq) < m(p,fp),则把fq作为p的新平面。在偶数次迭代时,q是p的左上边像素,奇数次迭代时,q是p的右下方像素。

  2.视图传播:p在邻域帧对应位置的像素p’的平面应该是比较相似的。所以把p’的平面转换到当前帧下fp’比较,m(p,fp’)是否小于m(p,fp),若是,则替换当前平面。

  3.时序传播:视频序列相邻两帧同一位置在同一个平面的可能性比较大。所以也可以比较取代价更小的作为p的平面。

python通过深度图像求目标距离值 图像深度算法_邻域_09d,python通过深度图像求目标距离值 图像深度算法_邻域_09python通过深度图像求目标距离值 图像深度算法_稠密重建_11,python通过深度图像求目标距离值 图像深度算法_邻域_09python通过深度图像求目标距离值 图像深度算法_稠密重建_13),找代价最小的那个平面。可以加速找到真实的平面。

>深度图获取与优化

  深度一致性检查:判断图像I与邻域的共视区域的深度是否一致。

  实现方法:把图像Ii中的点p投影到世界坐标系下,反投影到对应邻域帧Nk上,得到深度值d(X,Nk),与邻域帧Nk的深度python通过深度图像求目标距离值 图像深度算法_深度图_14(X,Nk)进行比较,如果与至少k个邻域的深度比较接近则认为p点是个正确点。

python通过深度图像求目标距离值 图像深度算法_深度图_15

参考文献与代码框架

参考文献:[1].Accurate Multiple View 3D Reconstruction Using Patch-Based Stereo for Large-Scale Scenes.

     [2].PatchMatch Stereo - Stereo Matching with Slanted Support Windows

代码框架:

python通过深度图像求目标距离值 图像深度算法_三维重建_16