双目立体匹配修炼之路


前言

提示:这里是本人学习双目立体匹配的学习总结。


提示:以下是本篇文章正文内容,下面案例可供参考

一、双目立体匹配是什么?

思考一个问题:人的双眼是如何观察,感知现实的三维世界呢?
生活中的现象是:你不断的闭上左眼,再睁开,然后去看距离你较近的物体,你会发现这个物体的位置在变化;当你同样的方法去看距离较远的物体时,你会发现没有什么变化。
根据这个现象,我们引入了双目视觉

1.双目视觉:

(baidu)它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。

2. 视差:

所谓的视差,即同一空间物理点在不同图像中的映像点对应起来后,会有一个相对差别,这个差别,我们称作视差,就是上面所说的当你睁眼闭眼的时候,近处的物体位置好像在变化。

3.“对极约束”概念:

首先,单眼看世界,比如左眼:Oc就是摄像机镜头中心,红色坐标系理解为相机坐标系,绿色的射线就是你的一束目光,也叫射线Ray,此时镜头中的某物体成像后,处于照片X的处
在这里插入图片描述
接着,双眼看世界:你的目光望向同一个物体,Oc为左相机,Oc`为右相机,绿色的ray相交。左边相机成像在X处,右边相机成像在
在这里插入图片描述

4. 对极几何(Epipolar Geometry)

接下来这幅图:描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅试图之间的的相对姿态
1.基线(baseline):直线Oc-Oc’为基线。

2.对极平面束(epipolar pencil):以基线为轴的平面束。

3.对极平面(epipolar plane):任何包含基线的平面都称为对极平面。

4.对极点(epipole):摄像机的基线与每幅图像的交点。比如,上图中的点e和e’。

5.对极线(epipolar line):对极平面与图像的交线。比如,上图中的直线l和l’。

6.点共面:点x,x’,摄像机中心Oc Oc’,空间点X是5点共面的。

7.极线约束:两极线上点的对应关系

在这里插入图片描述

5. 如何计算得到深度呢?

来看一个景深相机的模型:不用过多解释,A,B,D三个点在左边相机中成像位置不同,在右边相机中成像在同一个位置,理由就是这三点都在右边相机的Ray上
在这里插入图片描述
这时,假如要得到A距离相机连线的位置,只需知道A点在左右相机成像中的视差即可。
在这里插入图片描述
用这个图进行解释:
在这里插入图片描述
图中 P是三维物体的顶点坐标,其和左右相机光心 CL,CR的连线与左右相平面的交点PL` 和 PR,[公式] 即为投影点。注意现在说的所有坐标都是定义在同一个坐标系内,坐标原点与标架已经在图中左下角标识出来了。

现在如下图:
在这里插入图片描述
从公式可以看出,视差 d 和深度 z 成反比关系。视差越大,可以探测的深度越小。 b 是两个相机光心的距离,又叫基线(baseline),f 是相机的焦距。 b、f 与深度均成正比关系

视差公式:D= f * b / d * ps
f=Focal length
b=Baseline
d=Disparity value
ps=Pixel size
D=Depth

二、《Bilateral Grid Learning for Stereo Matching Network》论文学习

1.文章简介

1.1 摘要

立体匹配网络的实时性对于自动驾驶、机器人导航和增强现实(AR)等许多应用都是非常重要的。虽然近年来立体匹配网络取得了很大的进展,但在实时性和准确性之间的平衡仍然是一个挑战。本文提出了一种新的基于学习双边网格切片操作的保边代价体积上采样模型。切片层是无参数的,使得我们可以在学习到的导航图的指导下,从低分辨率的成本体中高效地获得高分辨率的高质量成本体。提出的成本量上采样模块可以无缝地嵌入到许多现有的立体匹配网络中,如GCNet、PSMNet和GANET。由此产生的网络在保持相当精度的同时,加速了几倍。在此基础上,我们设计了一个实时网络(称为BGNet),它的性能优于现有的实时深度立体匹配网络,以及一些基于Kitti立体数据集的复杂网络。

从摘要中我们知道,目前双目立体匹配算法一个问题在于实时性准确性间的一个平衡。而这篇文章的核心应该是"双边学习网格",那什么是双边学习网格呢?想知道什么是双边网格,得先了解双边滤波器

2. 论文学习之路

该章节参考文章:
知乎:双边滤波——作者:Jargon
CSDN:双边滤波和双边网格——作者:亚古兽要进化
CSDN:双边格网(bilateral grid)——作者:flow_specter
知乎:Bilateral Grid直观理解——作者:七海
Paper2007:Real-time Edge-Aware Image Processing with the Bilateral Grid

2.1 双边滤波

为什么用双边滤波器呢?因为高斯滤波(均值滤波)去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。而双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息灰度相似性,达到保边去噪的目的

对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。 双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值的点的权重更大,灰度值相差大的点权重越小。此权重大小,则由值域高斯函数确定。两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度与比一般的滤波慢很多,而且计算量增长速度为核大小的平方.

对图像进行空间域滤波的方法是使用一个结构元素(核)来对原图像进行卷积。该图所展示待滤波图像P,像素值差断崖处即为图像中的某条边缘线,经过空间核Gs,值域核Gr相乘后的双边核,最后达到了保边去噪
在这里插入图片描述
看看下面这两张图:
高斯滤波在这里插入图片描述双边滤波在这里插入图片描述

OK,上面所讲其实就是,高斯滤波(均值滤波)很好,但其权值系数仅仅考虑像素空间信息,这样在像素差异较大的图像边缘处,边缘会被模糊掉,所以双边滤波器不但考虑距离中心点像素的远近,还考虑核中心点像素值的大小差距,即考虑邻域灰度信息的权重。但是该权重显然是一个需要不断评估且变化的权重系数,因此速度很慢。那么就有了接下来的双边网格

2.2 双边网格

双边滤波速度很慢 —> 加速,双边网格。如何来理解双边网格呢?
我们用下图粗略解释如何利用Bilateral Grid对一维图片进行双边滤波的操作
在这里插入图片描述
双边滤波的目的是在保留图片中edge的同时,可以平滑其他非edge部分。上图中的例子是一维图片(图a),两条橙色的线表示的是图片不同位置的像素值(intensity level)。文中提出的数据结构“Bilateral Grid”,其实就是一个 对输入图片扩展了一个维度的tensor(图b),新扩展出的那个range维度,表示的就是原图中的像素值;旧的sapce维度,对应的自然就是原图中的像素位置

传统的双边滤波:

  • 通过加权重(range weight)的方式,来控制在一个edge两边的像素的weight相差很大,来达到保留edge的目的
  • 而除此之外,双边滤波在平滑非edge的部分上,采取的实际上是高斯模糊(Gaussian kernel)

因此传统的双边滤波,可以说是加权的高斯模糊:通过加权来保留edge

而《Real-time Edge-Aware Image Processing with the Bilateral Grid》文中作者所提出的双边网格:

  • 创造了一个高维的Bilateral Grid。为什么要这么做呢?因为这样可以把原图中的edge,在空间上就分隔开(图b)
  • 之后,只要直接使用Gaussian kernel,对grid进行卷积,放心地进行平滑操作(图c)。因为此时,不同edge两边的内容在空间上已经被分开了,因此edge不会被模糊
  • 最后,从高维的Bilateral Grid中取回原图中各个像素的值(图d)。这一步也很好理解,对于原图中的一个位置x,假设该处的像素值为p,则前往Bilateral Grid中的(x,p)处,该处的值就是原图中像素x被滤波之后的值。

从图c中可以看到,取回的值都是已经被平滑过的值了,因此实现了平滑功能;而edge由于在空间上不相邻的缘故则没有受到影响

看看原文中作者的例子:

在这里插入图片描述
可以看到

  • 双边网格实际是一个三维数组[横坐标x,纵坐标y,像素值z]
  • 双边网格支持积极的下采样
  • 通过额外的维度保留了边缘信息

Bilateral Grid为啥速度快呢?

  • 双边滤波需要两个不同权值系数的核,扩维后将位置信息和像素值信息分开,不用再去套公式算range weight,bilateral grid将这一过程直接转化为了grid的创建
  • grid不一定和原图相同大小,可以被下采样
  • 可并行GPU计算

至此:双边滤波可以简单的理解为在空间域内考虑到色彩域的信息,综合权重进行滤波,但是直接根据双边滤波权重的公式进行计算的话,常常在速度上令人着急,因此提出了在双边网格上模拟双边滤波的想法,在三维上既能够考虑到色彩域的信息,又能够加快速度。

现在将快速双边滤波的过程简洁的描述为: splat/blur/slice, 也就是在图像上进行采样操作,投影到3D网格上,在3D上进行滤波,再内插出每个( x , y ) (x,y)(x,y)上的值,重建出滤波后的影像。

三、Dataset

1.数据集介绍

1.1 Scenceflow
1.2 KITTI2012
1.3 KITTI2015

2.指标

在这里插入图片描述

2.1 EPE(noc)、EPE(all)

epe英文为end point error,以BGNet为例,其在KITTI2012数据集上EPE(noc)的指标为0.6,即网络预测的视差图Disp_Pre和真实视差图Disp_Gt在每个像素处的视差的误差的绝对值求和的均值为0.6
EPE(all)即全部像素处的epe
EPE(noc)即遮挡区域像素的epe

2.2 2-noc、3-noc、2-all、3-all

以BGNet为例,其在KITTI2012数据集上2-noc指标为3.13,即网络预测的视差图Disp_Pre和真实视差图Disp_Gt在每个像素处的视差的误差的绝对值超过2个pixels的所有像素占总像素的比例为3.13

2.3 D1-bg、D1-fg、D1-all

D1-bg代表背景区域,D1-fg代表前景区域,以BGNet为例,其在KITTI2015数据集上D1-bg的指标为2.07,即网络预测的视差图Disp_Pre和真实视差图Disp_Gt在①每个像素处的视差的误差的绝对值超过3个pixels,②相对误差大于5%,的所有像素占总像素的比例为2.07

注意:分清楚像素视差和视差的误差!!!

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
双目立体匹配是一种计算机视觉中的技术,主要用于将双目摄像头获取的两个视角的图像进行配准,获得二者之间的深度信息。Python是一种流行的编程语言,被广泛应用于科学计算和计算机视觉领域。 双目立体匹配算法旨在通过分析两个视角上的图像,找到对应点的像素坐标,进而计算该点的深度。这个过程涉及到图像预处理、特征提取以及匹配搜索等步骤。 在Python中,有许多开源的库和工具可用于实现双目立体匹配。例如,OpenCV库提供了丰富的图像处理和计算机视觉算法,包括双目立体匹配算法。使用OpenCV,我们可以通过加载两个视角的图像,获取它们的特征点,然后应用立体匹配算法来生成深度图。 Sad(Sum of Absolute Differences)是一种常用的匹配代价度量方法,用于计算两个像素块之间的差异。在双目立体匹配中,Sad是一种常用的代价度量方法之一,用于衡量两个像素块之间的相似度。通过计算像素块的Sad值,我们可以确定最佳匹配,并从而估计深度信息。 Python作为一种易学易用的编程语言,广泛运用于双目立体匹配的实现和应用中。它具有丰富的图像处理和计算机视觉库,并且有着不断更新和完善的社区支持。与其他编程语言相比,Python的语法简洁直观,使得双目立体匹配算法的实现更加便捷和高效。 总而言之,双目立体匹配是计算机视觉中的一项重要技术,而Python作为一种流行的编程语言,能够提供丰富的工具和库来实现该技术。通过使用Python和相关的图像处理库,我们可以实现双目立体匹配算法,从而获取深度图像,并在诸多应用领域中发挥其重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值