一、线段的提取和描述

在LBD的论文中,线段的提取依然是使用EDLine算法,但是在此基础上,增加了一个高斯金字塔。论文使用了一个没有内层的高斯金字塔,一般是五层,通过高斯模糊,逐层处理,之后对每一层使用EDLine算法提取线,提取出来的线利用边上像素的梯度来确定一个方向,边上所有像素的平均梯度所指向的方向,就是线的左侧指向右侧。

之后,将高斯金字塔中不同层的线整合到一起。所谓整合到一起,就是将同一条线在不同层上的表现整合在一起,为了方便叙述,将高斯金字塔最底层的一条线在其他层提取到的结果称为子线,那么整合这一步,实际上就是将线和子线放在一起,因为提取的时候是在高斯金字塔上不同层进行的,所以相当于要将子线对齐到线上。

从代码运行的结果来看,上面这张图实际上是理想情况,我在运行代码的时候,将每一层的子线数目都打印了一下,到高斯金字塔第五层的时候,由于进行了五次高斯模糊,所以图片的清晰程度已经很低了,提取出的线的数目大概是第一层的五分之一,也就是说,如果第一层有100条,第五层就只有20条,那么按照上图所示,在匹配完全成功的情况下,最多也就只有20个LineVec的大小为5,如果子线没有匹配的情况,LineVec的数目根本就没多少。
为了方便叙述,我们将子线分配的过程称为层间匹配,在层间匹配的过程中,代码的写法也比较难理解,假设一条线l在第一层为l1在第二层为l2,代码的写法上认为,如果这两线不匹配,那就是完全不相干的两条线,就是说如果因为EDLine算法的计算误差,导致l1和l2的偏差有些大,超过了匹配的阈值,这两条线完全就认为是两条线,会被分配独自的一个ID进行后续的处理。
这一点根据和师兄的讨论,觉得用特征增强的理论去解释更好理解,使用高斯金字塔,本身是一个描述远距离观察的过程,增加层数,相当于增加了观察者到图像的距离,提取出来的特征一方面看属于金字塔的不同层,但实际上还是图像的一个特征,所以,即使不匹配,也依然是图像的特征的一部分。

其实这部分按照理想的结果来看也是可以的,回到论文,完成高斯金字塔的构建和层间匹配之后,就需要计算LBD描述子,论文使用的描述子是基于条带的。所谓条带,实际上就是线周围的一个区域,如下图所示:

图像最中间的横向黑线就是直线本体,可以看见直线的两侧一共划分出了五个条带,用m表示划分条带的数目,用w表示每个条带的宽,根据这种划分方法,每个条带的长度其实都是一样的。规定直线的方向为dL,而与直线垂直且与直线方向夹角为顺时针90°的方向为d⊥,将线的中点作为坐标系的原点,这样就构建出了一个坐标系。

在这样的规定下,计算每个像素点的梯度,并将梯度按照坐标系的两个方向进行拆分:

除了梯度的拆分处理,为了增强描述子的鲁棒性,LBD还引入了两个距离有关的权值。一个是全局的权值系数fgi:

其中di表示的是到整个邻域中心的距离,而бg是一个描述条带宽度和数量的值:

对于这个全局的权值系数,只要条带的数目和宽度确定了,计算权值的时候就只有di这一项,根据指数函数的图像可以看出,距离中心越近,di越小,从而权值也就越大,对应图中fg的那条曲线。

另一个权值是一个局部的权值,和全局权值计算类似:

其中dk表示到条带中心的距离,而бl就是条带的宽度,同理在一个条带中,距离中心越近权值也就越大。

引入这两个权值,实际上就是为了降低原理直线中心位置的重要性,同时一定程度上降低垂直方向上变化的敏感度,减小条带之间变化。

有了权值和梯度,就可以开始描述子的计算。在计算描述子的时候,要考虑到相邻的条带,比如我们要计算Bj的描述子,那么我们就需要Bj
-1和Bj+1一起纳入计算,当然,对于第一个和最后一个条带来说,就只需要计算单侧。
LBD描述子的结构为:

实际上就是许多个条带的描述子的堆叠,而计算每个条带的描述子,也就是BD的时候,需要使用到BDM这个矩阵:

其中,一列表示条带的一行,j表示是从上到下第几个条带,当j为1或m的时候,n为2w,否则n为3w。对于矩阵中的一列,四个值的计算为:

其中λ为两个权值在当前位置的乘积,计算每一行像素梯度的投影,根据投影值将对应的量做加法,一行的值求和,就可以得到当前这一行的描述信息v,也就是BDMj中的一列,将所有列都计算出来,就得到了BDMj矩阵。现在对于一个这样的矩阵,它描述的实际上是一个条带的信息,我们要计算这个矩阵的每一列的均值Mj和标准差Sj,之后将均值和标准差堆叠到一起,也就得到了LBD描述子:

下面再重复一下LBD的描述子的计算过程,在一开始条带宽度和数目确定的时候,权值计算其实就已经可以计算了,遍历每个条带的邻域的每一行,计算梯度并投影,结合权值求出BDM矩阵,这样的一个矩阵描述了一个条带,计算均值向量和标准差向量,将每个条带的均值向量和标准差向量堆叠在一起,最后就可以得到一条线的LBD描述子。

二、利用LBD描述子进行匹配

在这篇论文中,还提出了一种匹配的方法,一般的思路是直接计算描述子距离然后找最近的,之前试过用LBD描述子直接计算描述子距离匹配,但是效果奇差无比,论文中提出的匹配方法,不仅考虑了描述子距离,还加上了线与线之间的几何关系,从而让匹配的结果更加准确。

现在我们已经得到了一条线的描述子,按照论文中的流程,在进行匹配之前,需要进行两次的筛选。
第一个筛选是利用角度旋转和长度变换来筛选。首先,用旋转直方图的方法来计算一个全局旋转角,所谓旋转直方图,就是一个统计图像中线的方向的统计图,分别统计两张图的旋转直方图,之后按照下面的公式确定全局旋转角:

为了增加全局旋转角的准确性,这里还将长度纳入了统计,也就是在一个角度上的线的长度,在旋转前后应该也要符合一定的要求。当长度和旋转直方图的限制都符合要求,则认为计算出了全局旋转角,那么对于一对要匹配的线,旋转的角度必须要满足全局旋转角,只有这样则认为通过了第一步筛选。

第二个筛选就是描述子的距离,不过计算会稍微有些区别,对于两条线,这里计算的相似度,是比较两条线所有的子线,找出子线描述子距离的最小值,如果这个值满足阈值,就认为通过了第二个筛选。

通过了这两个筛选,也就是旋转的变化符合全局旋转角、长度变化小于阈值且描述子距离足够小的线对,就可以认为是候选线对,当然现在的候选线对是存在误匹配的,所以论文又在这一步之后,加了一个利用位置关系的筛选。

在位置关系的筛选中,我们要做的是取出两对匹配线对,也就是四条线,两张图上各两张,拿一张图来示例:

对于同一张图上的一条线,计算下面的两个量:

可以看出,I描述的就是线的起点终点与两条线角点的关系,而P描述的是线的起点终点到另一条线的投影距离的关系。在此基础上,两组线对的相似度关系可以定义为:

其中的量为:

可以看出,这一步是利用两对候选线对之间的几何关系,计算出了一个相似度,因为如果线对是匹配的,那么两对线对的相对位置关系,在两张图中应该是存在一定的相似度的,利用这个相似度,就可以再一次进行筛选。
将所有线对的相似度计算完成后,可以构成一个矩阵,而且是一个实对称矩阵,这里我们记作矩阵A。那么现在问题就变成了从中选择可信度最高的线对,按照论文的说法,现在用一个向量x来表示线对的选择与不选,最大化可信度也就变成了寻找一个向量x,让匹配关系限制满足的情况下,最大化矩阵A的二次型:

说实话这里我也有些拿不准,根据矩阵A元素的计算规则,里面所有元素都是正数,那么如果要最大化二次型,直接让x为一个全1向量不就好了,想了很久,也许这个思路错在没有考虑匹配关系的限制,因为矩阵A是候选线对的相似度,也就是说可能存在一对多的现象,让x全为1,表示所有的候选线对都认为是正确的,此时就会出现一对多的误匹配,自然是不行的。
所以,在这个背景下,计算向量x是一个很麻烦的事情,论文参考了另一个人的论文,认为我们要找的向量,就是矩阵A的主特征向量,即最大的特征值对应的特征向量,所以我们要做的就是直接调用求主特征向量的函数,然后根据这个特征向量,去找出哪些线对是正确的。

算法的完整步骤为:

从两张图中筛选出线的向量并计算描述子,之后计算全局旋转角,根据两步筛选得到候选线对,利用几何关系计算相似度并组合出矩阵A,这里着重解释一下后面的步骤,得到矩阵A之后,通过ARPACK计算特征向量,后面初始化一个集合LM,一开始为空集,用来存储正确匹配的线对,根据主特征向量,找出其中的最大值,如果这个最大值不为0,就将对应位置的线对加入LM,并在候选线对中删除这一对,这里对应的是第8步,然后在第9步,又对候选线对做了筛选,如果出现冲突就从候选线对中删除冲突线对,这一步应该是为了满足一对一匹配的要求,防止出现一对多的误匹配。最后筛选得到的集合LM,就是最终匹配的结果。

An efficient and robust line segment matching approach based on LBD descriptor and pairwise geometri相关推荐

  1. 目标检测之线段检测---lsd line segment detector

    (1)线段检测应用背景 (2)线段检测原理简介 (3)线段检测实例 a line segment detector (4)hough 变换和 lsd 的区别 --------------------- ...

  2. 直线段检测算法(LSD:a Line Segment Detector)

    直线段检测算法(LSD:a Line Segment Detector) 1 简介 LSD是一种线段检测算法,该方法能在较短的时间内获得较高精度的直线段检测结果. LSD直线检测算法首先计算图像中所有 ...

  3. a Line Segment Detector

    FROM:http://blog.csdn.net/polly_yang/article/details/10085401 近来比较忙+生病,没有大段的时间学习PGM,临睡前回顾一篇论文--<L ...

  4. 【转】 LSD(Line Segment Detector) 直线段检测算法学习~

    论文回顾之一 一种新的直线段检测算法---LSD:a Line Segment Detector 原文地址:http://blog.csdn.net/polly_yang/article/detail ...

  5. 语义分割--Efficient and Robust Deep Networks for Semantic Segmentation

    Efficient and Robust Deep Networks for Semantic Segmentation Code: https://lmb.informatik.uni-freibu ...

  6. C++line segment intersection线段求交(交点)(附完整源码)

    C++line segment intersection线段求交的实现 C++line segment intersection线段求交实现的完整源码(定义,实现,main函数测试) C++line ...

  7. 【文献翻译】LSD: A Fast Line Segment Detector with a False Detection Control

    前言 博主译文水平不好,为了学习,所以进行论文翻译和研究,博文以译文为主.如果有翻译不对之处,还请各位指出,便于我修改. 文献信息 引用格式:Gioi R G V, Jakubowicz J, Mor ...

  8. Efficient and Robust 2D-to-BEV Representation Learning via Geometry-guided Kernel Transformer(GKT)论文

    Efficient and Robust 2D-to-BEV Representation Learning via Geometry-guided Kernel Transformer 论文笔记 原 ...

  9. A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记

    A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK 文章地址:https://ieeex ...

最新文章

  1. 中级实训第一天的自学报告
  2. FPGA设计细节和实现(初学者)
  3. java plc通讯_树莓派+西门子PLC+Aliyun
  4. java 文件字节流_Java:文件字符流和字节流的输入和输出
  5. Apollo分布式配置中心部署以及使用
  6. 这些全国各地的特色面,你都吃过了吗?
  7. JDK8新特性之函数式接口
  8. vue 共用新增和修改验证分离
  9. pandas.Series.values
  10. 随笔 2016-1-4
  11. centos配置epel和remi源
  12. redhat7的wget使用
  13. 五子棋c语言程序人人对战,C语言 AI智能,五子棋 人机对战,人人对战
  14. ios设置音乐audio自动播放
  15. 奥升德赢得三星SDI锂离子电池添加剂专利案;蜂巢能源完成102.8亿元人民币B轮融资;伊顿、特灵科技、芬美意发布财报 | 能动...
  16. 网页脚本输入这么简单
  17. 关于IDEL中的全局搜索不显示该有的类的解决办法之一
  18. Wireless Networking in the Developing World (Second Edition)
  19. 学习Python中turtle模块的基本用法(3:学习绘图示例源码)
  20. 2020焊工(高级)考试题及焊工(高级)考试软件

热门文章

  1. linux 安装nvm ,管理多版本nodejs
  2. CenterOS的安装配置(配图解)
  3. 在cdh5.1.3中在mapreduce使用hbase
  4. android studio 安装apk失败,AndroidStudio安装apk时失败时提示INSTALL_PARSE_FAILED_NO_CERTIFICATES...
  5. Hadoop-MR实现日志清洗(三)
  6. 快速校对所有文件的md5值
  7. hdu 1710 Binary Tree Traversals (二叉树)
  8. 找工作经验之——准备工作
  9. IIS和Asp.Net页面运行机制
  10. 【恋上数据结构】插入排序及二分搜索优化