一、部分原文解读

1.尺度空间关键点检测

兴趣点用一个显著性标准在图像和尺度空间进行识别。为了加快计算的效率,关键点可以在金字塔图像的层或者层之间进行检测。每个关键点的位置和尺度通过二次函数拟合的方式在持续的区域获得。

2.关键点描述

一个由依靠合适的尺度中心圆的点组成的采样方式是应用在每个关键点的邻域上来恢复灰度值:计算局部梯度强度的过程中,特征的方向可以被确定。最终,BRISK的采样方式被用来获取被组合到二值化BRISK描述子的成对亮度比较结果。一旦形成,基于二进制描述子的BRISK关键点可以很快地进行匹配。

在本文中,我们用了一种新颖的成为“BRISK”的方法用于高质量、快速、描述和匹配。此方法在一个有意义的延展上是旋转和尺度不变性的。对比最先进的技术可以戏剧性的降低运算成本。在描述方法后,我们利用基准数据和用评估方法的标准呈现了实验结果。也就是,我们用SURF和SIFT这个广泛作为图像转换的标准来评估BRISK。重点在于BRISK描述子和其他关键点描述子的结合而且反之亦然。

考虑到计算的效率,我们的检测方法是被Mair的工作启发的。他们的AGAST是以FAST为基础来扩展的,对于特征获取来说是很有效的一个方法。考虑到尺度不变性是高质量关键点的关键,我们用在图像平面和用FAST分数作为手段的尺度空间来进行深层次的搜寻最大值。虽然对比与另外好的描述子(如:快速Hessian)在大的尺度间隔下会有离散化,BRISK描述子可以在连续的尺度空间评估每个关键点的正确尺度。在BRISK框架,金字塔由n层倍频程和n层内部倍频程组成,典型的,n=4。倍频程是用从原图一半下采样得到的。每个内部倍频程位于倍频程之间。第一内部倍频程是有原图的1.5因子下采样得到的。剩下的内部倍频程是由联系的半采样得到的。对于FAST和AGAST的关键点提供不同选择的掩膜形状都是很重要的。在BRISK,我们几乎用9-16的掩膜,它在16像素的圆里提供了至少9个连续像素,这样在无论是比中心像素更亮或者更暗的情况在FAST的标准下都能成功执行。

刚开始,FAST 9-16描述子用同样的阈值T在每个倍频程和内部倍频程分别执行来识别潜在的兴趣区域。接下来,这个区域中的点将在尺度空间中进行非极大值抑制:首先,问题中的点需要在同一层中的8邻域内达到最大值的条件。分数s被定义为最大值阈值也成为图像点。第二,在此层上面和下面的分数越低越好。我们选择2内部平等尺寸方形补丁:边长度被选为2个像素。由于邻层用不同的离散化来呈现,一些插值应用在补丁的边缘上。下图中描述了采样和最大搜索。

关键点是用分析三个相邻层的8邻域的分数来进行判断的。在三个层中,局部最大值进行亚像素优化,之后,1维的抛物线在尺度轴上进行拟合来决定关键点的正确尺度。关键点的位置在最靠近决定尺度的最大值之间进行重新插值。考虑到图像的连续性质量不只要在图像上也要在尺度规模上,我们对每个最大值执行了亚像素和持续化规模的优化。为了限制优化过程的复杂性,我们对每个三层的组合做了一个最小二乘意义上的二次方程拟合,使得在三个亚像素优化到卓越的最大值。为了避免重采样,在每层上考虑用3*3的补丁。然后,这些优化后的分数用来拟合抛物线。在最终的阶段,我们重新插值了在各层之间的图像。对于在两个船序列间的BRISK检测例子在图2中进行展示。

圆的尺寸决定了检测特征点的尺度,径向决定了它们的方向。为了更清晰,检测阈值设置了一个比经典设置更严格的值,产生了略低的重复性。

3.关键点描述子

给了一系列关键点,包含亚像素优化图像位置和浮点尺度值,BRISK描述子被一个连接亮度比较测试结果的二值化字符串组成。这个方法很有效,然而这里我们用一种更有效的方法。在BRISK中,我们识别了每个关键点的方向特征用来做方向归一化,强化了实现旋转不变性这个对鲁棒性的关键点。而且,我们仔细的选择了亮度对比。

BRISK采样模式用N=60个点:小蓝色圆贡献了采样位置;大的,红色虚线的圆表示用来平滑的高斯核的值。这个模式显示了尺度为1的情况。

4.采样方式和旋转评估

BRISK描述子的关键概念使用了采样关键点邻域的模式。这个模式,在下图中描述,定义了N均分在圆上的位置。虽然这个方式类似于DAISY描述子,但是它在BRISK的应用上是完全不同的,因为DAISY是用来做密集匹配的。能够捕获更多的信息,因此对速度和存贮量有要求。为了避免在这种模式下对点进行采样的重叠影响,我们使用了高斯平滑。通过图像中的关键点k定位和尺度化,这种方式考虑到采样点对的N(N-1)/2中的点。在这些点中的平滑值用来估计局部梯度:

阈值的距离设置为最大为9.75t,最小为13.67t。通过迭代,评估整个关键点k是:

长距离对被用来计算,建立在局部梯度而不需要全局梯度。这也可以试验性的用距离阈值的最小值来判断。

5.建立描述子

对于旋转和尺度归一化描述子,BRISK运用了在关键点k旋转的采样方式。向量描述子由所有的短距离强度点对组成,每个位b相关的式子是:

虽然BRIEF描述子也通过亮度比较来组成,BRISK有一些和采样方式的明显缩放和旋转不同。首先,BRISK用一个确定的采样方式使得采样点分布在关键点的给定半径内。因此,定制的高斯滤波在两个模糊的采样点中进行时,比较的亮度不容易变形。BRISK用相当少的采样点减少了查找的强度值。最终,这里的比较被分别限制使得亮度只在局部范围内变化。根据上述的采样方式和距离阈值,我们获得了一个512的字节长度。这个BRIEF64包含512位,也就是描述子对的匹配将会同样快。

6.描述子匹配

匹配两个BRISK描述子是在BRIEF中用简单的Hamming距离。看两个描述子的数目相同但位不同的异或为1的数。

执行说明:所有的BRISK建立在普通2维特征表面,允许存在的特征的简单的集成和可交换。检测过程用了AGAST实现计算的卓越性。极大值抑制得益于早期终止能力减少了了最小值的计算量。建立图像金字塔使用了一些SSE2和SSSE3的指令。进行了半采样和1.5因子的下采样。为了有效的用采样方式检索灰度值,我们生成了离散旋转和缩放的BRISK方式版本需要40MB的RAM容量,对于低计算的完全够的。我们接下来用一个积分图像和一个简易的高斯核函数,这个高斯函数的核是尺度的计算量不会有很复杂的变化。之后我们用了一个方箱平均滤波器。虽然我们不需要用许多不同核的时间高斯滤波器,但是我们需要用一个任意的参数替换检索单值。我们也使用了改进的SSE汉明距离计算器使得匹配的速度达到6倍。

7.总结

BRISK,解决了经典的视觉识别、描述和没有场景先验知识和相机姿势的匹配关键点问题。和现有基础算法对比,像SIFT和SURF,比较匹配性能方面,这个算法快很多。BRISK依靠简单的圆形采样方式,它计算亮度对比值形成二进制描述子字节。BRISK的这种独特的方式可以广泛的应用,尤其是对于实时限制和计算能力:BRISK最终提供了在如此时限应用下的高端特征的质量。在之后对BRISK的深度研究,我们旨在探索尺度空间的最大值来达到更高的重复性同时还保持了速度。

二、代码

这里用opencv进行编程

在特征库features2d中有现成的BRISK的算子。按BRISK的原理步骤,要先用FAST进行关键点的确定,之后生成描述子,然后再用汉明距离进行相似比较。

1.关键点检测

Mat c_src1 =imread("F://lena.jpg",1);
    Mat c_src2 = imread("F://lena1.jpg",1);
    Mat src1 = imread("F://lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    Mat src2 = imread("F://lena1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    cv::BRISK detector;
    std::vector<KeyPoint>kp1;
    std::vector<KeyPoint>kp2;
    detector.detect(src1,kp1);//这里用灰度图进行关键点的检测
    detector.detect(src2,kp2);

2.描述子的形成

Mat des1,des2;
    int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
    detector.compute(src1,kp1,des1);//描述子
    detector.compute(src2,kp2,des2);
    Mat res1,res2;
    drawKeypoints(c_src1,kp1,res1,Scalar::all(-1),drawmode);//在内存中画出特征点,以防堆栈异常
    drawKeypoints(c_src2,kp2,res2,Scalar::all(-1),drawmode);

3.匹配

BFMatcher matcher(NORM_HAMMING);//用汉明距离作为匹配准则
    vector<DMatch> matches;
    matcher.match(des1,des2,matches);
    Mat img_match;
    drawMatches(src1,kp1,src2,kp2,matches,img_match);//生成匹配图像
    imshow("",img_match);
    waitKey();

在BRISK下用lena做匹配的效果图。这两幅图在方向和大小上不太一样,可以看到BRISK的旋转不变性和尺度不变性。

未完待续。。。。。。。

BRISK算法学习笔记相关推荐

  1. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  4. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  5. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  6. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  7. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  8. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  9. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

最新文章

  1. java list接口为何要重新声明collection接口的方法_JAVA Collection接口中List Map 和Set的区别(转)...
  2. 异常“企图释放并非呼叫方所拥有的多用户终端运行程序”的处理
  3. Leetcode376摇摆序列--贪心+自动机
  4. 算法笔记之回溯法(2)
  5. matlab 交叉验证 代码,交叉验证(Cross Validation)方法思想简介
  6. 10月末周网络安全报告:应用程序漏洞占比93.1%
  7. c# Point不能输入小数
  8. Netcore webservice
  9. 二维向量vector初始化问题(以统计字符串字母题为例)
  10. html5豌豆上的公主,豌豆上的公主阅读练习及答案
  11. beatmaker3 android,faded打击垫
  12. 台湾 计算机术语,快取,陣列,程式,这些台湾的计算机术语,你知道几个?|冷知识...
  13. Ubuntu20.04安装有道云词典
  14. Android 9.0 10.0 Launcher3 时钟动态图标的定制化(时钟动态图标)
  15. 【搜索】桐桐的运输方案
  16. 大家好!欢迎来到YANG先森博客......
  17. [arm-linux]使用arm驱动hp1020激光打印机
  18. 微机原理_微处理器架构
  19. Mac上将dmg文件转成iso的方法
  20. 〖大前端 - 基础入门三大核心之CSS篇⑯〗- 相对定位、绝对定位 与 固定定位

热门文章

  1. C++引用的定义和使用
  2. 双光栅衍射的matlab仿真,双光栅干涉衍射原理解析 - 全文
  3. python安装traceback_python:traceback
  4. App优化--App瘦身
  5. 信息系统项目管理师自学笔记(二十)——网络接入技术
  6. Linux入门学习(十 二)—— 怎么临时设置ip地址?怎么永久的更改网络的IP地址?
  7. 警惕冒充“数字人民币”诈骗案!
  8. 了解Metasploit中的Payloads(有效载荷)
  9. python逗号_python的逗号
  10. 安全管理实务之三:漏洞管理(转)