今天介绍一种特征提取算法:BRISK(Binary Robust Invariant Scalable Kepoints)

BRISK是Stefan等人在ICCV11上发表的。通过对原论文进行泛读后,对该算法有了一定的了解。

原论文地址如下:

https://www.researchgate.net/profile/Roland_Siegwart/publication/221110715_BRISK_Binary_Robust_invariant_scalable_keypoints/links/0deec52d6aea6c8a2e000000/BRISK-Binary-Robust-invariant-scalable-keypoints.pdf

BRISK是一种改进的BRIEF算法,该算法具有高计算效率旋转、尺度不变性的特点,对噪声也有一定鲁棒性。

该算法总的来说分为以下几步:

构建尺度空间

尺度空间的建立通过对原图像进行降采样实现,尺度空间包括n个octaves和n个intra-octaves,一般来说n的值为4。那么我们就有一个8层的图形金字塔。图像金字塔是一种以多分辨率来解释图像的结构,在SIFT特征提取中也有用到,如下所示:

BRISK中用到的图形金字塔每层octaves是通过缩放因子2来降采样,而每层intra-octaves则通过缩放因子1.5来降采样。最终的8层octaves尺寸如下图所示:

如果原图长为18像素,那么intra-octave0将被下采样为12个像素,octave1则为9个。

建立完这8张不同的尺度图像之后,下一步要对每一层尺度空间进行FAST 9-16关键点检测,阈值这里为T。

FAST 9-16关键点检测可以自行CSDN搜索或者等我的FAST学习笔记发表。

得到关键点后,下一步则是对关键点进行非极大值抑制,具体就是将特征点和金字塔中的上下尺度图层(2*9个点)和当前图层邻域(8个点)共26个邻域点的FAST Score进行比较,只保留这26个点中FAST Score最大的点,非极大值抑制过滤了一些关键点,使得提取出来的点,更具有代表性。

通过非极大值抑制后得出的点由于是在不同的尺度图层中表示的,所以离散度也有所不同。这样得出的点并不能精准表达特征。接下来还需要进一步定位他们。

亚像素和连续尺度细化

论文中提到 “将图像显着性视为一个连续量,不仅在整个图像上,而且在比例尺维度上。我们采用亚像素和连续尺度细化方法。

为了精简亚像素和连续尺度细化的过程,原论文中使用了在三个目标图层的最小二乘意义上的二次方程拟合方法。

看到这里的时候我也有点一头雾水,但是可以通过这幅图简单理解:

我们通过尺度空间构建只得到了8个不同的尺度图层,但是设想如果最大的FAST Score值坐落于两个连续尺度中间呢?如上图中红色点所示。

为了解决这个问题,我们采用以下方法:对于三个连续图层di,ci和di-1和三个连续图层中的三个相应关键点进行最小二乘意义的二次方程拟合,得到上图右侧红色方程。为了防止重采样,在每层采用3*3像素的score patch。然后对x和y方向上插值,得到准确的极值点和坐标位置,再对尺度方向进行一维插值,得到关键点所对应的尺度。这就求得了关键点位置关键点尺度。下一步将会用到。

关键点描述

论文中提到BRISK描述子可以作为一个二值化字符串通过连接亮度比较测试集表示。然而,一种更有效的办法:识别关键点方向并做方向归一化,这种做法可以强化旋转不变性。

采样模式和旋转估算

BRISK的一个重要概念就是使用采样关键点邻域的模式。如下图所示:

以关键点为中心,构建不同半径的同心圆,每个圆有不同等间隔采样点,在图中表示为蓝色圆点。所有采样点包括特征点共N个。为了避免混叠效应,所有采样点都应进行半径为r方差为σ的高斯滤波。N个采样点会产生N*(N-1)/2个采样点对。局部梯度值g可以被表示为以下公式:

这里的像素灰度值关键点尺度,p表示关键点位置

集合A是所有采样点对

这里的两个阈值S和L分别是短距离S和长距离L,阈值分别设置为,,t是关键点所在尺度。

最后的特征点主方向可以通过以下公式计算:

这里g使用长距离计算。

构建描述子

为了构建旋转和尺度归一化描述子,论文中运用了在关键点旋转的采样方式,旋转角度为。向量描述子由所有的短距离二进制编码来描述,编码方式如下:

表示旋转角度,最终通过以上公式生成了一个512的二进制编码,这也就是BRISK64。

特征点匹配

这里使用了Hamming距离来实现特征点匹配,不懂得同学自行百度。

这里配上一张论文中的实验图像,可以看出BRISK的旋转不变性。

参考资料:

https://www.researchgate.net/profile/Roland_Siegwart/publication/221110715_BRISK_Binary_Robust_invariant_scalable_keypoints/links/0deec52d6aea6c8a2e000000/BRISK-Binary-Robust-invariant-scalable-keypoints.pdf

https://blog.csdn.net/weixin_40196271/article/details/84143545?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160946160016780310190700%252522%25252C%252522scm%252522%25253A%25252220140713.130102334..%252522%25257D&request_id=160946160016780310190700&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-84143545.first_rank_v2_pc_rank_v29&utm_term=BRISK%E7%AE%97%E6%B3%95

https://senitco.github.io/2017/07/12/image-feature-brisk/

特征提取算法——BRISK(Binary Robust Invariant Scalable Kepoints)学习笔记相关推荐

  1. BRISK: Binary Robust Invariant Scalable Keypoints——论文翻译

    本文翻译过程中参考这篇文章 摘要:从一幅图片中高效地寻找关键点始终是一个深入研究的话题,以此形成了众多的计算机视觉应用的基础.正在这个领域中,先驱算法SIFT和SURF在各种图形转换中表现出了巨大的性 ...

  2. BRISK: Binary Robust Invariant Scalable Keypoints

    本文提出了一种新的图像特征点提取算法,最终产生一个二进制的描述符.步骤如下: BRISK所提取的点具有尺度不变性,为了保证特征点具有尺度不变性,就必须进行尺度空间的构建.先构建n个octave层(用C ...

  3. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  4. 算法与程序设计:算法的表述方式及其发展(学习笔记)

    算法与程序设计:算法的表述方式及其发展(学习笔记) 算法与程序设计 算法概念分析 算法的表述方法 自然语言 流程图 N-S图 PAD图 伪代码 算法描述的发展现状 通俗来讲,算法是定义如何完成一个任务 ...

  5. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  6. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 竞赛树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 竞赛树 一.赢者树 二.二叉树的数组描述(补充) 1.声明 2.实现 三.赢者树 1.抽象数据类型 2.赢者树的表示 3.声明 ...

  7. 目标检测——YOLO系列算法(YOLOv4、YOLOv5)的学习笔记

    目录 1 前言 2 致谢 3 YOLO模型列表 4 模型结构 2.1 Backbone Focus--网格下采样 CSPDarknet53 2.3 Neck -- SPP & PAN SPP: ...

  8. 文本比对的一种算法探索、比对算法中的难点及解决方法---学习笔记记录

    在录入文本里,有2种字符:"有效字符"和"多打字符"."有效字符"是指它在标准文本里可以找到唯一的"对应字符".&quo ...

  9. 学习sift算法的原理和步骤_深度学习笔记47_你也可以成为梵高_风格迁移算法的原理

    神经风格迁移 可用来干什么? 同deepDream一样是驱动图像修改的一个重大进展.可以把照片风格化,看起来就像是一幅画一样.这些为你提供非常多漂亮的艺术风格,就像是梵高所画的<星夜>. ...

最新文章

  1. 算法-------寻找旋转排序数组中的最小值
  2. Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件
  3. es6 name属性
  4. CV:计算机视觉基础之图像存储到计算机的原理daiding
  5. python获取中文字体点阵坐标_Python实现点阵字体读取与转换的方法
  6. Django从理论到实战(part1)--虚拟环境
  7. 前端学习(1608):react-router-dom基础
  8. LeetCode 474. 一和零(01背包动态规划)
  9. Python学习记录——函数
  10. 在Windows上安装Nexus
  11. 爱我或者恨我,我就是我!
  12. jenkins发送构建邮件配置项中文
  13. Hadoop配置文件详解
  14. java 定义泛型方法_Java泛型类与泛型方法的定义详解
  15. 传奇服务器怎么修改升级武器成功,传奇论坛服务端教程原创升级武器不碎完整脚本...
  16. Shel脚本-初步入门之《04》
  17. SVN更新,错误提示版本库的 UUID不匹配
  18. PEEKABOO——测试随笔
  19. 你安全吗?丨通过IP地址如何查到实际地址?
  20. 传奇单机版就是自己在家里架设一个

热门文章

  1. Android实现二维码扫描登录网页
  2. process.env环境变量配置方式(配置环境变量区分开发环境和生产环境)
  3. 读书杂谈-《架构探险:从零开始写Java Web框架》
  4. python报错:ValueError: not enough values to unpack (expected 6, got 3)
  5. Verilog十大基本功1(流水线设计Pipeline Design)
  6. [转贴]希腊字母读音表
  7. 用C++解线性规划问题
  8. Acceptor 和 Connector
  9. 鸿蒙操作系统系列——Hi3516 OpenHarmony_2.0_canary版本设备开发起始篇
  10. 色彩搭配六色rgb_除非您是色彩理论方面的专家,否则色码编码人员指南请勿使用rgb代替...