0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文读懂经典双目稠密匹配算法SGM

新机器视觉 来源:古月居 作者:古月居 2022-12-15 15:12 次阅读

题图为SGM算法的一个处理结果。

最近来看看一些双目稠密匹配的算法。说来惭愧,SGM在航测领域是很重要的算法(当然也是最好的双目稠密匹配算法之一),自己却没有认真读过,只是大致有些了解。

看了论文,再结合网上一些资料,自己做了些论文笔记。

想到关于SGM论文网上还没看到比较翔实的博客,就把自己做的笔记再加些解释分享出来了(下文中的引用部分多为我自己的思考)。

其中还有一些是自己不理解的地方,准备后续写代码时研究。

也希望大家可以分享自己的见解,或对文章内容进行批评指正。

由于是论文笔记,所以有些中英夹杂,而且有些想想也不好翻译,就不再改了。闲话少说,直接来看论文吧。

基础

双目图像稠密匹配的4个基本步骤为:

Matching cost computation;

Cost aggregation: connects the matching cost within a certain neighborhood;

Disparity computation: selects the disparity with the lowest matching cost;

Disparity refinement: removing peaks,

interpolating gaps or increasing the accuracy by sub-pixel interpolation.

这4个都比较好理解,SGM论文也是按照这样来组织的。

下面就按照论文的顺序来详细了解下SGM算法。

中心思想及要求

idea: 使用MI (Mutual Information) 来进行单像素匹配 + 多个一维平滑约束(来拟二维约束)来进行“全局”优化。

前提: 已知立体像对间的对极几何关系。

c55d51f6-7b8e-11ed-8abf-dac502259ad0.png

Pixelwise cost calculation

SGM算法不用图像块进行匹配,只考虑当前像素。因为利用图像块进行匹配对应的隐性约束为块内像素的视差是相同的,而这在深度变化(物体边界)的地方是不成立的。

信息(MI):defined from the entropy(熵)of two images:

c56af874-7b8e-11ed-8abf-dac502259ad0.png

c590a16e-7b8e-11ed-8abf-dac502259ad0.png

上式针对整张图像而非单个像素,不能用作 cost。因此,对于一张图像的联合熵,有其他论文利用泰勒展开计算:

c5bc1f56-7b8e-11ed-8abf-dac502259ad0.png

其中,公式内第一项为像素 p 的灰度值,第二项为匹配像素的灰度值。

这里,联合熵被简化为左图所有像素点(及其对应点)的 h(i1,i2) 之和。

c5e38492-7b8e-11ed-8abf-dac502259ad0.png

c6085092-7b8e-11ed-8abf-dac502259ad0.png

c6194e60-7b8e-11ed-8abf-dac502259ad0.jpg

可以看到,由于极线矫正后左右图十分相似,所以得到的联合分布直方图类似于一个对角矩阵。

以上计算并不包含被遮挡的像素(如何得知哪些像素是被遮挡的?)。因此,为了避免包含遮挡像素,建议将熵也这么计算:

c640a118-7b8e-11ed-8abf-dac502259ad0.png

此外,以上计算也只针对两张图像的重叠部分。

因此,一维直方图也可以这么计算:

c6535a38-7b8e-11ed-8abf-dac502259ad0.png

h(i) 即为 P(I1, I2) 第 i 行(列)像素之和。

最终,互信息的定义为

c664e3a2-7b8e-11ed-8abf-dac502259ad0.png

c68722a0-7b8e-11ed-8abf-dac502259ad0.png

对于像素点 p,若取其视差为 d,则对应的 cost 为:

c6987820-7b8e-11ed-8abf-dac502259ad0.png

问题:想要对匹配图像 Im 进行视差矫正就需要视差图。

但我们的目标就是获取视差图。

解决:

迭代法:start with a random disparity map for calculating Cmi. And use the cost for matching and calculating a new disparity map.

论文表示大致迭代3次就可以了。

层次法:recursively use the up-scaled disparity map (half resolution). Start with a random disparity map of 1/16 resolution. 在这个1/16的视差图上重复计算3次(每次迭代3次,然后每放大一倍迭代3次计算出新的视差图。

c6b3f082-7b8e-11ed-8abf-dac502259ad0.png

Aggregation of costs

以上就是论文进行匹配的第一步。接下来就要进行一个“全局”上的优化。

pixelwise matching 还是不够稳定,因此需要加上一些约束来保持同一平面的像素具有相同的视差并惩罚邻域内视差不连续的像素(即平滑)。

所以最小化如下能量方程:

c6cd87b8-7b8e-11ed-8abf-dac502259ad0.png

上式第一项为所有 MI cost 的和;

第二项对 像素p的邻域内出现视差与p的视差相差1 的像素 加上一个惩罚项P1;

第二项对 视差相差大于1 的像素加入更大的惩罚P2.

c6ded784-7b8e-11ed-8abf-dac502259ad0.png

作用:对于小的视差相差使用较小的惩罚以适应斜面或曲面;

对大的视差相差使用大的惩罚来防止深度(视差)不连续。

问题在于全局最小化 E(D) 是一个 NP 完全问题,很难解算。

单行(1D)约束可以利用动态规划达到多项式时间。

因此很自然地想到优化多个单行的约束条件来拟合2D优化,作者建议至少要选择待优化像素的8个方向。

The aggregated smoothed cost S(p, d) for a pixel p and disparity d is calculated by summing the costs of all 1D minimum cost paths that end in pixel p at disparity d.(也就是说S是所有L之和。)

c6f6d24e-7b8e-11ed-8abf-dac502259ad0.png

c7149004-7b8e-11ed-8abf-dac502259ad0.png

c72d45c2-7b8e-11ed-8abf-dac502259ad0.jpg

考虑到上述代价最后可能非常大,可将之修改为:

c7410422-7b8e-11ed-8abf-dac502259ad0.png

注意到被减项对于该方向上,像素 p 的任意视差都是一个常数(上一个像素的视差及其对应的最小cost已经计算好)。

最终,对于像素 p,选择视差 d 的cost 就是:

S(p,d)=∑rLr(p,d)

c792f6ce-7b8e-11ed-8abf-dac502259ad0.png

选择使 S(p, d) 最小的视差d. 若要到亚像素精度,可以利用 neighboring costs 来拟合一个二次曲线。

c7a5b8a4-7b8e-11ed-8abf-dac502259ad0.png

Multi-baseline matching

对左图计算完视差图后,还可以以同样的方法来对右图进行视差图的计算,在将二者融合起来。也可以利用多个立体像对来计算多张稠密视差图。

问题:areas which are not seen by all images will become invalid.

解决:取多视差图的并集而非交集。

对于左图来说,它的视差图是恒定值(参考依据视差计算深度的公式),因此可以通过多图匹配来优化。

对左图计算一个视差图后,也可对右图计算一个视差图。然后进行一致性校验:

c7b9c038-7b8e-11ed-8abf-dac502259ad0.png

如此,确保 one to one mapping (uniqueness constrain).

Disparity Refinement

之后,是对所得的视差图进行优化处理。个人觉得这是双目稠密匹配很重要的一步,因为对于很多算法,其得到的视差图之间的差别并不会特别大。

重要的是对所得的视差图进行后处理,提高深度计算的精度。

移除极值

采用联通域分割法,将视差相差在1个像素以内的像素4邻域归为一个联通域来分割所得的视差图。

根据场景事先确定一个大小阈值,去除像素数量过少的联通域。

Intensity Consistent Disparity Check

这步是SGM后处理比较核心的一步。

室内场景的前后景之间会有视差不连续。

但前述的能量方程对于发生视差不连续的位置没有偏好,这种不连续可能在错误的地方出现,因此会造成错误的前后景物体边界,或者一个斜面。

先前的将像素梯度与惩罚值P2关联可以部分解决该问题。

但在一些视差不连续的不对称的情况(如前景物体没有完全出现,只在出现的一边产生视差不连续)下可能失败(原因待解)。

室内环境中,后景常常为无纹理区域,如墙等。为解决这个问题,先提出以下三个假设:

无纹理区域内部没有视差不连续现象(即视差变化伴会随梯度变化);

无纹理区域包含一些弱纹理(否则也无法进行像素匹配);

无纹理区域的表面可以用一个平面表示(参考1,如此则区域内视差恒定。否则为两个可以分割开的区域)。

解决步骤:先对图像进行分割,得到前后景区域。问题就变为如何正确选择后景(无纹理区域)的边界和视差,较好的分割出前景物体。

利用 fixed bandwidth Mean Shift Segmentation 方法分割原始图像,得到各个无纹理区域(假设1),忽略过小区域,所得区域表示为 Si。

利用联通域分割法分割步骤1得到的无纹理区域(假设2),忽略过小区域,所得分割区域表示为 Sik;

针对2得到的区域拟合平面 Fik (假设3)。将得到的各个可能平面推广到所在的整个无纹理区域,取能量方程最小的平面。

遮挡判断子步骤:对于像素p,若其匹配像素q有了另一个匹配,且新的匹配像素的视差大于像素p,则像素p认为被遮挡;

该无纹理区域内的视差都替换为最佳拟合平面所对应的视差;

c7ce26fe-7b8e-11ed-8abf-dac502259ad0.png

c7e00914-7b8e-11ed-8abf-dac502259ad0.png

Discontinuity Preserving Interpolating

后处理完的视差图可能因为遮挡或误匹配而存在缺失区域。对这些区域的视差进行插值前要对其性质进行分类,以使用不同的插值方法:

遮挡:用背景的视差进行外插值,而不使用前面的遮挡物的视差;

误匹配:可以利用其周围像素进行内插值。

注意:对与遮挡相连的误匹配区域,同样利用背景像素进行外插值。

区分:由于遮挡会照成视差不连续。被遮挡位置的像素的极线不与disparity function(即视差随位置变化的方程)相交;误匹配像素则相反。

c7fe3a24-7b8e-11ed-8abf-dac502259ad0.jpg

如上图,点p1处就是因为遮挡而造成点缺失;而点p2则是因为误匹配。

插值仍然是从像素周围的8个方向计算出8个可能的视差值,然后

c80e158e-7b8e-11ed-8abf-dac502259ad0.png

该式的第一项是选择待选视差中第二小 (second lowest) 的视差。第二项为选择待选视差的中值,这样有利于在物体边界处保持视差不连续。

该插值方法独立于立体相对匹配算法。

最后可以再用中值滤波对得到的视差图进行去噪处理。

最后,作者还介绍了对于超大幅的航空影像进行分块处理的方法和加速技巧.

以及解释了文章中不先对右影像整张影像进行极线矫正的原因(对于推扫式的航空/航天影像,其极线为曲线,因此无法进行矫正,只能实时计算)。

但对于其他普通立体像对,这些内容都是不必要的,就不再解释了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4610

    浏览量

    92859
  • SGM
    SGM
    +关注

    关注

    0

    文章

    5

    浏览量

    10588
  • 匹配算法
    +关注

    关注

    0

    文章

    24

    浏览量

    9376

原文标题:一文读懂经典双目稠密匹配算法SGM

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    双目立体视觉三大算法原理及其代码实现

    双目立体视觉中常用的基于区域的局部匹配准则主要有图像序列中对应像素差的绝对值之和SAD(sum of absolute differences)、对应像素差的平方之和SSD(sum of squared differences)及半全局
    发表于 07-01 09:34 2181次阅读
    <b class='flag-5'>双目</b>立体视觉三大<b class='flag-5'>算法</b>原理及其代码实现

    双目影像密集匹配算法的综合分析

    自适应权重法是推动局部密集匹配算法发展的关键。自2006年Yoon等[53]首次提出可以在匹配质量与全局匹配算法相媲美的局部
    的头像 发表于 11-27 10:29 1671次阅读
    <b class='flag-5'>双目</b>影像密集<b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的综合分析

    双目立体视觉原理大揭秘(

    、分割出来。这样就完成了特征点提取,为下步“精确化数字描述”做好了基础。第二、精确化数字描述(立体匹配、姿态测量)。这部分指的是分割出障碍物的特征点以后需要用有效的数值来描述,在双目视觉系统中当然就是
    发表于 11-21 16:20

    【Firefly RK3399试用申请】基于双目摄像头的视觉景深算法开发

    项目名称:基于双目摄像头的视觉景深算法开发试用计划:1.在这个试用活动刚开始的时候我就申请了,但是很遗憾没有通过。由于工作的原因我在今年开发了套本来打算用于VR设备设备的双目手势识别
    发表于 08-21 12:42

    读懂接口模块的组合应用有哪些?

    读懂接口模块的组合应用有哪些?
    发表于 05-17 07:15

    读懂如何去优化AC耦合电容?

    读懂如何去优化AC耦合电容?
    发表于 06-08 07:04

    读懂什么是NEC协议

    读懂什么是NEC协议?
    发表于 10-15 09:22

    读懂中断方式和轮询操作有什么区别吗

    读懂中断方式和轮询操作有什么区别吗?
    发表于 12-10 06:00

    双目视觉立体匹配算法研究

    双日视觉是计算机视觉领域的个重要组成部分。双目视觉研究中的关键技术摄像机标定和立体匹配直是研究的热点。本文由两部分组成,分别对双目视觉的
    发表于 08-14 16:41 0次下载

    双目立体计算机视觉的立体匹配研究综述

    双目立体视觉技术具有成本低、适用性广的优点,在物体识别、目标检测等方面应用广泛,成为计算机视觉领域的研究热点。立体匹配双目立体视觉技术中的核心算法,对实现物体三维重建具有重要作用。在
    发表于 04-12 09:47 3次下载
    <b class='flag-5'>双目</b>立体计算机视觉的立体<b class='flag-5'>匹配</b>研究综述

    种基于PatchMatch的半全局双目立体匹配算法

    景。因此,从计算复杂度、匹配精度、匹配原理等多方面综合考虑,提出了种基于 Patchmatch的半全局双目立体匹配
    发表于 04-20 11:31 13次下载
    <b class='flag-5'>一</b>种基于PatchMatch的半全局<b class='flag-5'>双目</b>立体<b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    读懂MCU的特点、功能及如何编写

    读懂MCU的特点、功能及如何编写
    发表于 12-05 09:51 24次下载
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>MCU的特点、功能及如何编写

    几种经典双目匹配算法

    matching)复杂,对计算资源消耗很大。那我们介绍下几种经典双目匹配算法。 【双目匹配
    的头像 发表于 07-04 11:33 3372次阅读
    几种<b class='flag-5'>经典</b>的<b class='flag-5'>双目</b><b class='flag-5'>匹配</b>的<b class='flag-5'>算法</b>

    读懂,什么是BLE?

    读懂,什么是BLE?
    的头像 发表于 11-27 17:11 2285次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>,什么是BLE?

    读懂车规级AEC-Q认证

    读懂车规级AEC-Q认证
    的头像 发表于 12-04 16:45 944次阅读