【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法
一、LSD算法
LSD算法主要是用来提取直线的算法,算法主要是利用每个像素的梯度作为基础来进行处理。
对于每个像素,计算level-line和level-line angle,之后level-line会将整个图转换为level-line field,根据level-line的角度,在一定容忍度内的会被划分到同一个line-support regions中,这些支持域会被作为直线段的候选。
接下来对这些直线段的候选做筛选,将支持域的一个主惯性轴作为矩形的主方向,从而构建出一个最小外接矩形。
之后检查矩形中像素的level-line angle,如果与最小外接矩形的主方向的角度差在容忍度范围内,这个像素就被称作同性点。统计最小外接矩形内所有的像素数量和同性点的数量,之后利用a contrario approach and the Helmholtz principle这两个原则进行检测。
这两个原则是说在完美噪声图像图像中不应该检测到目标和一个不会检测到目标的噪声图像,具体做法就是引入一个新的模型a contrario model,这个模型可以理解为一个完美噪声图像,每个像素值相互独立,并且服从[0,2π]的均匀分布。然后分别对目标图像以及引入的噪声图像的矩形框区域内的像素以及aligned points进行统计,计算图像aligned points个数小于噪声图像aligned points个数的概率,再乘一个比例系数,就作为NFA的值,根据这个值判断是不是一条线。
二、LBD描述子
提取到的直线如果需要后续的匹配等操作,必不可少的就是描述方法,LBD就是一种用来描述直线的描述子。
为了减小运算量,对输入的原始图像进行下采样,从而构成一个N层的尺度空间金字塔,使用Edline算法对每层的尺度空间进行搜索,从而每层找到一组线,每条直线都有一个方向,将其分配ID并且存放在一个向量中。
这段操作是说去检测同一条直线在每一层中的不同表现,从而筛选出同一条直线在N层中直线构成的集合存放在一个向量中,对于上面这张图来说,就是找红蓝黄绿四条颜色的线在金字塔四层中的不同表现,将其放入同一个向量中。
用这样一个向量去描述一条线,为了描述这样一条线,我们使用一种条带描述方法,需要在每条线所在的层上进行描述。在线所在的一层中,对线的支持域做如图所示的划分,条带的数目和宽度都可以变化,条带的长度设置为线段的长度,每个条带都是平行的。
在此基础上构建局部二维坐标系,根据这个二维坐标系的方向,将每个像素上的梯度投影到这个坐标系上。这样就可以计算一个条带的描述符了,每条条带的描述子BDj,主要通过其最近的两相邻行的条带Bj-1和Bj+1来计算,计算上下左右四个方向上的梯度投影和。
一个条带用一个BD表示,每个BD的计算需要依赖条带描述矩阵BDM,BDj由BDMj矩阵的均值向量和标准方差得到 。下面这就是一个条带描述矩阵,每列代表一个像素,也就是这个条带有n个像素,每个像素都会进行四次投影计算得到每列的四个值。
也就是说,一个LBD描述子描述的是这一坨条带,每个条带用一个条带描述子BD表示,而每个BD包括两部分,分别是条带对应的BDM的均值向量和标准方差。
三、普朗克坐标
一种描述线的方法,在三维空间中,取直线上的两个点p1p2,则原点与两个点的连线可以构成两个向量,这里也记为p1p2,令d=p2-p1,m=p1×p2,普朗克坐标就是利用这两个向量去描述这条直线。d没有进行单位化,所以有长度也有方向,而且它的方向刚好就是直线的方向,大小是构成三角形的低。而m是两个向量的叉乘,从向量的角度来看,叉乘的结果依然是一个向量,向量的方向指向两个相乘的向量的垂线方向,大小为向量围成平行四边形的面积,所以m方向指向垂直方向,模的大小为围成三角形面积的两倍。有了这些可以计算出来的量,我们可以利用三角形的面积去搞事情,确定了底边的长度和三角形的面积,实际上就确定了高的长度,也就是线距离中心点的距离,或者说原点到描述的直线的距离,之后再利用两个向量的方向,就可以唯一确定一条直线。
四、EDLines
这里补充一下EDline算法,这个算法主要分为三步:提取像素点、连接像素点和优化。
提取像素点分为四步,首先利用一个滤波核遍历一遍图像,起到一个抑制噪声的作用,之后计算像素梯度,筛选梯度较大的为“锚anchor”,这些锚代表的就是极有可能为线段一部分的点,之后连接锚点从而生成一个初始线段。
上图是提取过程的一个图示,a是经过高斯滤波之后的灰度图,对这个灰度图计算梯度,求出来b中的梯度图,白色的部分代表梯度高的位置,再从这些点中筛选锚,变成图c的样子,接下来根据梯度信息连接锚点,产生一个初始的线段,就是图d的样子。
体现在代码实现上,代码通过使用cv库中一些现成的函数,得到处理过后的梯度图,筛选锚点的过程是遍历整个梯度图,对于非图像边缘的点,比较上下两个像素的梯度值,其余情况比较左右两个像素的梯度,超过设置的阈值就认为是一个锚点,这样来看的话锚点就是比相邻元素梯度差别较大的点。
产生初始的线段是连接每个锚点所产生的,会存在不光滑的问题,所以需要进行筛选,去除其中不合条件的点,从而让线段更加平滑,这里使用最小二乘法去解决这个问题。
平滑处理之后就是筛选操作,需要中间参数进行合理估计和选择,才能得到适当数量和位置的拟合线段。主要的思路是使用NFA的概念,用NFA去将不合条件的边去掉,这个思想或者说这个算法主要是利用梯度和梯度角的概念,与一般的梯度计算稍微有所区别,论文中使用的公式为:
这里的检验是在原图的基础上检验的,也就是将前面检测出来的线叠加在原图上,这时候,假设线段的长度为n,计算沿线段的每个像素的梯度角和与线段方向一致的像素点数量k,对于每条线段都计算一个NFA值,如果NFA值小于等于1则认为线段有效,否则舍弃,NFA的计算公式为:
其中N的四次方表示潜在线段的数量,图片的大小为N×N像素,所以一共有N2个点,每两个点可以连接出一条线段,所以一共有N4条线段。对于这个公式,还剩下一个p需要讨论:
从公式含义的角度来看,这个NFA值应该就是概率的延伸值,后面的部分实际上是个古典概型的概率,p代表了同方向的概率,将n看作线的长度,或者说是线上像素的个数,那么这个概率模型可以解释为是从长度为n像素的线段上筛选i个像素,这些像素梯度同方向的概率,因为i从k开始取,而k是已经检测出来的同方向的点数,那么这部分求和是不是就是在计算整条候选线真的是一条没问题的线的概率,也就是这个NFA值越大,越代表候选线可能是一条线。
更新一下最新的思路,关于这个NFA的计算公式,因为在LSD中也是用了,而这里使用的公式变成了:
这里可以看见,后面都会跟一个二项分布的概率值,这个值可以解释为线上同向点数目大于等于待检测线数目的概率,而前面这部分个人感觉用排列组合中的抽样来理解比较好解释。那EDLine的来说,前面的N4可以看作是从N4条线中随机选了一条结果刚好是当前这一条的概率,在这个事情发生的基础上,这条线上同向点多余待检测的点,这个概率值如果很大,说明因为巧合产生你待检测的结果这件事情的概率是比较大的。这就好比你从大街上随便拉了一个人,让他在答题卡上踩了一脚,结果刚好所有答案全踩到了而且还对了一半,不仅拉了一个人是这样,拉了很多人都能做到,这种情况下,你说你认真做得了零分的可信度就很低,很难怀疑你不是脑子有点病。这个例子的情况下,选一个人就对应了N4,而后面的踩一脚答题就是二项分布概率值。
根据这篇论文中进行的实验,这个EDLine算法可以在检测效果差不多的情况下,比LSD速度提升十倍,可以看出这个算法的强大,个人感觉主要的提升点在于锚的筛选,因为LSD是对全部像素进行的操作,找了一个外接矩形然后对内部的像素进行检验,之后再用NFA进行优化筛选,而引入了锚之后,通过连接锚点来代替计算外接矩形,减少了不少的计算量,从而实现了十倍的速度提升。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法相关推荐
- SLAM--PL-SLAM中基于线特征的初始化方法(LSD算法,LBD描述子,计算R和t)
SLAM中基于线特征的初始化方法 线特征的初始化 直线段检测算法---LSD:a Line Segment Detector 描述子---LBD:Line detection and descript ...
- 线特征的LSD提取算法
线特征的LSD提取算法 线段检测器算法 算法流程 大多数图像中都存在直线特征,是视觉感知.描述外部环境的重要特征信息.直线是一种大尺度的特征,在水面环境中具有更为理想的适用性,线特征具有光照和视角不变 ...
- 线特征LSD提取、LBD描述子匹配实现过程源码
使用opencv实现线特征LSD提取.LBD描述子匹配实现: 具体逻辑如下: 1.设置读图的路径 2. 加载图片 3. 创建mask掩代码 4.初始化参数 5.检测LSD线段 6. 计算尺度第一塔的描 ...
- HCIE学习记录——数通网络基础
HCIE学习记录 数通网络基础 HCIE学习记录 前言 一.什么是网络? 1.通信的五要素 二.简单网络设备 1.交换机 1.1.广播域 2.路由器 总结 前言 HCIE数通方向学习记录. 一.什么是 ...
- MySQL学习记录04where条件子句、联表查询、子查询
文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...
- 半直接单目VO | PL-SVO:快速、鲁棒的SLAM线特征跟踪
作者 | 猛女瘦瘦 编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/571034195 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨 ...
- 跑胡子胡牌算法(带赖子、基于回溯算法)
跑胡子规则 跑胡子,小写"一"到"十"各4张共40张,大写"壹"到"拾"各4张共40张. 砌牌:跑胡子为3人同玩,庄家砌 ...
- 学习记录1.0(基础算法)
蒟蒻的总结 主要总结了排序.前缀和(偷懒).差分(偷懒).离散化和区间和并问题. 还没学哈希表.二叉树啥的 ,学了之后会更新的新的做法的! 大部分都来自Acwing啦! 1.快速排序 用指针左右往中间 ...
- 【学习记录-java】Java基础学习笔记
学习Java的一些笔记 前言 java中字符串的比较 Stream 流之 sorted 运算符 Java包(package)的命名规范&规则 SWITCH CASE java中import作用 ...
- mySQL学习记录(局域网连接/基础查询/条件查询/常见函数/窗口函数/表连接/子查询/插修删建表)
一些基础概念 DB 数据库 存储数据的容器 DBMS 数据库管理系统 又称数据库软件.产品如mysql/oracle/db2/sqlserver SQL 结构化查询语言 是所有的DBMS都使用的一种D ...
最新文章
- java中strictfp关键字,java strictfp关键字用法大全详解
- linux里hba状态_linux查看hba卡状态
- 2020年高等数学方法与提高(上海理工大学)学习笔记:向量代数与空间解析几何
- loadrunner录制脚本,页面无法显示
- debian安装搜狗
- 两表左连接count某一字段_表连接解决多日留存率问题|SQL
- jQuery.fn.load调用时给url加selector之后执行脚本的方法
- oracle ocm 考题,2012年10 月oracle 10g ocm 认证 考试 真题 题库
- Javascript:radio单击触发事件
- 通知:逆天异常库 V1.0版本支持下载了~~
- 使用Arduino+声音模块+LCD显示屏制作分贝仪
- 低延迟视频传输 UDP JPEG图像压缩 opencv
- 2018.11.4 东华杯(骇极) REVERSE What's it wp
- 系统大作业. 多酶级联反应酶配比及投料优化(1)
- axis=0与axis=1
- JFrame的使用方法
- 提升eBay店铺流量的方式有哪些?
- English语法_名词性从句 - what
- oracle列转行 多个字段_oracle 多列 列转行
- parallels安装linux命令行,mac系统下虚拟机parallels安装ubuntu 14.04
热门文章
- java代码演示经典哲学家就餐问题,以及解决方案
- 【PHPWord】PHPWord导出PDF格式文件的几种方式以及最优解并附代码
- Uni-app 小程序 App 的广告变现之路:全屏视频广告
- 手把手教你智能硬件开发(一) 我选Arduino
- 多个excel工作簿合并_多人收集表格,数据比较和合并工作簿,Excel隐藏功能一键搞定!...
- ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER
- html页面常见布局
- 抖音头像有钩什么意思,抖音上有黄勾和蓝勾什么意思
- 小米路由器设置:网桥模式以及IPv6
- Spring整合mybatis事务管理