详解SIFT、SURF和ORB特征点检测和描述算法

news2024/11/22 14:09:45

文章目录

  • 0 引言
  • 1 SIFT算法
    • 1.1 主要目的
    • 1.2 主要步骤
    • 1.3 示例代码
  • 2 SURF算法
    • 2.1 主要目的
    • 2.2 主要步骤
    • 2.3 示例代码
  • 3 ORB算法
    • 3.1 主要步骤
    • 3.2 代码示例
  • 4 三者对比

0 引言

本文主要对SIFTSURFORB特征点检测和描述算法进行详细的学习和比较。

⚠️ ⚠️ ⚠️ :SIFT、SURF是有专利保护的算法,在 opencv-contrib-python=3.4.3之后专利收费,可用anaconda创建一个临时环境,安装指定版本来测试:pip install opencv-contrib-python==3.4.2.17

1 SIFT算法

SIFT (Scale-Invariant Feature Transform) 是一种计算机视觉算法,用于检测和描述图像中的局部特征。SIFT 算法由 David Lowe1999 年提出,并在 👉 2004年的论文中详细描述。

1.1 主要目的

SIFT 算法的主要目标是提取图像中的关键点,这些关键点在不同尺度和旋转下都具有不变性。它在图像中寻找具有稳定特征的局部极值点,并计算这些关键点的描述子。这些描述子可以用于在不同图像之间进行特征匹配,从而实现图像识别、目标跟踪等应用。

1.2 主要步骤

SIFT 算法的主要步骤如下:

  1. 尺度空间极值检测(Scale-space extrema detection):通过在图像的不同尺度上应用高斯差分Gaussian difference-of-Gaussian)进行滤波,检测图像中的极值点。这些极值点通常对应于图像中的边缘、角点等关键位置。

  2. 关键点定位(Keypoint localization):通过在尺度空间中对极值点进行精确定位,排除低对比度和边缘响应不明确的关键点。SIFT 算法使用了尺度空间的极值点的曲率来过滤掉不稳定的关键点。

  3. 方向分配(Orientation assignment):为每个关键点分配一个主方向,用于后续计算关键点的描述子。这样可以使描述子对旋转变换具有不变性。

  4. 关键点描述(Descriptor computation):根据关键点的尺度和方向,计算关键点周围区域的描述子。描述子通常使用关键点周围的梯度方向直方图表示,具有一定的独特性和不变性。

1.3 示例代码

由于OpenCV库中已经有对应的SIFT算法接口,直接调用即可,如下python代码:

import cv2

# 加载图像
image = cv2.imread('liuyf.jpg')
# 创建 SIFT 对象
sift = cv2.xfeatures2d.SIFT_create()
# 检测关键点和计算描述子
keypoints, descriptors = sift.detectAndCompute(image, None)
# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 保存图像
cv2.imwrite('image_with_sift.jpg', image_with_keypoints)
# 显示图像
cv2.imshow('Image with Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中输入左图,输出右图,主要调用了cv2.xfeatures2d.SIFT_create()创建SIFT对象,然后调用sift.detectAndCompute(image, None)检测关键点和计算描述子。

SIFT 算法的主要优点是其对尺度、旋转、仿射变换等具有较好的不变性,使得它在图像匹配、目标识别和三维重建等领域具有广泛的应用。然而,SIFT 算法计算量较大,不适用于实时应用,后续也出现了一些更快的替代算法,如SURFSpeeded Up Robust Features)和ORBOriented FAST and Rotated BRIEF)。

2 SURF算法

SURF (Speeded Up Robust Features) 是一种基于 SIFT 算法的改进版本,它在计算效率和描述子的稳健性方面进行了优化。SURF 算法由 Herbert Bay 等人于 2006 年提出,并发表👉 SURF论文。

2.1 主要目的

SIFT 算法相比,SURF 算法主要改进了以下两个方面:

  1. 尺度空间极值检测:SURF 算法使用快速Hessian矩阵(Fast Hessian)来检测图像中的尺度空间极值点。相比之下,SIFT 算法使用高斯差分金字塔来检测极值点,而快速Hessian矩阵能够更快地计算图像的尺度空间。

  2. 描述子计算:SURF 算法使用了一种加速技术称为积分图像(Integral Image),用于快速计算关键点周围区域的梯度和特征描述子。这种技术可以显著加快计算速度。

由于 SURF 算法对尺度、旋转和仿射变换具有较好的不变性,并且计算速度更快,因此在实际应用中得到了广泛的应用。与 SIFT 算法相比,SURF 算法在实时性要求较高的场景下更加适用

2.2 主要步骤

SURF算法的主要步骤可以概括为以下几个阶段:

  1. 尺度空间构建:首先,对输入图像进行尺度空间构建。这通常涉及使用高斯滤波器构建图像的金字塔,通过不同尺度的图像来检测不同尺度的特征。

  2. 关键点检测:在每个尺度的图像中,使用Hessian矩阵计算特征点的兴趣值。Hessian矩阵描述了图像局部区域的灰度变化情况,通过检测局部最大值或最小值来确定关键点。

  3. 关键点定位:通过在尺度空间中插值,精确定位关键点的位置。这样做是为了提高关键点的精度,并且能够在亚像素级别进行定位。

  4. 方向分配:对于每个关键点,计算其主要方向。这通常通过计算特征点周围区域的梯度方向直方图来实现。主要方向用于后续的描述子计算和旋转不变性。

  5. 描述子计算:在关键点周围的邻域中,计算描述子来描述关键点的特征。SURF算法使用了一种基于哈尔小波响应的描述子计算方法。描述子捕捉了关键点周围区域的局部特征。

  6. 特征匹配:使用描述子比较来进行特征匹配。常见的方法是使用距离度量(如欧氏距离或汉明距离)来衡量描述子之间的相似性。匹配算法可以采用暴力匹配或更高级的方法(如最近邻搜索或KD树)。

  7. 异常值剔除:在进行特征匹配后,可能存在一些错误的匹配或异常值。通过应用一些筛选机制(如RANSAC算法)来剔除这些异常值,以获得更准确的匹配结果。

2.3 示例代码

由于OpenCV库中已经有对应的SURF算法接口,直接调用即可,如下python代码:

import cv2

# 加载图像
image = cv2.imread('liuyf.jpg')
# 创建 SURF 对象
surf = cv2.xfeatures2d.SURF_create()
# 检测关键点和计算描述子
keypoints, descriptors = surf.detectAndCompute(image, None)
# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 保存图像
cv2.imwrite('image_with_surf.jpg', image_with_keypoints)
# 显示图像
cv2.imshow('Image with Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中输入左图,输出右图,主要调用了cv2.xfeatures2d.SURF_create()创建SIFT对象,然后调用surf.detectAndCompute(image, None)检测关键点和计算描述子。

3 ORB算法

ORBOriented FAST and Rotated BRIEF)也是一种目前常用的计算机视觉算法,用于图像特征提取和描述。它是在FAST角点检测器和BRIEF描述子算法的基础上进行改进的。👉 ORB论文

详细的实现版本也可参考如下的ORB-SLAM2中的ORBextractor

👉 ORB-SLAM2算法8之特征点提取、生成描述子的ORBextractor

3.1 主要步骤

`ORB算法的主要步骤如下:

  1. FAST角点检测:使用FASTFeatures from Accelerated Segment Test)算法检测图像中的角点。FAST算法通过比较像素点与其周围邻域像素的灰度值来判断是否为角点。

  2. 构建金字塔:为了对不同尺度下的图像进行处理,ORB算法使用图像金字塔。通过对原始图像进行不断的降采样,得到一系列尺度不同的图像。

  3. 计算角点的方向:为了提取具有旋转不变性的特征,ORB算法使用灰度质心法来计算角点的方向。它计算角点周围像素的灰度质心,然后根据质心的位置计算角点的方向。

  4. 构建BRIEF描述子:使用BRIEFBinary Robust Independent Elementary Features)算法构建特征描述子。BRIEF算法通过在角点周围选择一组特定的像素点对,并比较它们的灰度值来生成一个二进制编码,用于描述特征点的特征。

  5. 特征点匹配:使用描述子之间的汉明距离Hamming Distance)来度量两个特征点的相似性。通过比较特征点的描述子,找到最佳匹配的特征点。

3.2 代码示例

由于OpenCV库中已经有对应的ORB算法接口,直接调用即可,如下python代码:

import cv2

# 读取输入图像
image = cv2.imread('liuyf.jpg')
# 创建ORB对象
orb = cv2.ORB_create()
# 检测关键点和计算描述子
keypoints, descriptors = orb.detectAndCompute(image, None)
# 可选:绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 保存图像
cv2.imwrite('image_with_orb.jpg', image_with_keypoints)
# 显示结果
cv2.imshow('Image with Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中输入左图,输出右图,主要调用了cv2.ORB_create()创建SIFT对象,然后调用orb.detectAndCompute(image, None)检测关键点和计算描述子。

4 三者对比

算法SIFTSURFORB
原理SIFT算法通过在不同尺度空间和旋转角度上检测图像中的关键点,并计算每个关键点的局部特征描述子SURF算法也是基于尺度空间的特征提取方法,使用了积分图像的数据结构来加速计算,并检测图像中的兴趣点,并计算每个兴趣点的局部特征描述子ORB算法结合了FAST关键点检测器和BRIEF描述子。FAST用于检测关键点,BRIEF用于计算关键点的二进制描述子
特征描述子SIFT算法生成128维的局部特征描述子SURF算法生成64维的局部特征描述子ORB算法生成二进制的局部特征描述子
计算效率SIFT算法计算效率较低,尤其在计算特征描述子时需要进行大量的高斯模糊和梯度计算操作SURF算法相对于SIFT算法来说计算效率较高,主要得益于使用积分图像结构来加速计算ORB算法具有较高的计算效率,主要因为FAST关键点检测器和BRIEF描述子都是基于快速计算的算法
尺度不变性SIFT算法对于尺度变化具有较好的不变性SURF算法也具有一定的尺度不变性ORB算法在尺度变化较大的情况下可能不太稳定
旋转不变性SIFT算法具有很好的旋转不变性SURF算法也具有一定的旋转不变性ORB算法在旋转角度较大的情况下可能不太稳定
鲁棒性SIFT算法在处理光照变化、噪声等情况下具有较好的鲁棒性SURF算法对于光照变化和噪声有一定的鲁棒性ORB算法在光照变化和噪声较小的情况下表现较好


Reference:

  • SIFT 论文:https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf
  • SURF 论文:https://people.ee.ethz.ch/~surf/eccv06.pdf
  • ORB 论文:https://www.gwylab.com/download/ORB_2012.pdf
  • ORB-SLAM2算法8之特征点提取、生成描述子的ORBextractor



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站为什么一定要使用SSL证书?

在现代社会,随着互联网的快速发展,越来越多的人开始使用网络来完成日常生活中的各种任务。而在这个过程中,网站作为网络中最重要的组成部分之一,也逐渐成为了人们日常生活中的不可或缺的一部分。但是,随着网络攻击和数…

深入分析APK文件格式

前言 最近在升级项目的 Gradle 及 AGP 版本,在进行APK编辑再压缩时遇到了前后压缩比不一致的问题,所以抽空又一总结了下 APK (ZIP) 文件格式。 无论是使用 7z 进行包体积优化,或是快速构建多渠道包,又或是V2、V3签名等都是基于 …

问卷调查中常见问题及解决方法

随着技术和市场的日益发展,问卷调查已经成为了人们了解客户需求和反馈的一种必要手段。但是,问卷调查也面临着一些问题。在本文中,我们将探讨一些常见问题,问卷调查会遇到什么问题?怎么解决?并提供一些解决…

【斗破年番】火火抱彩鳞把她整害羞啦!女王解锁新造型,身形丰满超有料

Hello,小伙伴们,我是小郑继续为大家深度解析斗破年番系列。 斗破年番已经更新,这集的精彩程度可以说出乎预料。不论是节奏的把控,打戏的呈现还是氛围的营造都十分的出彩。尤其是在萧炎施展三千雷动时运用的三年之约时的BGM简直让观感体验瞬间…

审计和风控做什么——企业审计和风控工作的相同和不同

审计和风控是现代企业管理中两个重要的领域。它们在企业和社会组织的运营中发挥着重要作用。本文将探讨审计和风控的异同点。 一、审计和风控的定义 审计是指对一个组织或个人财务报表、业务过程、内部控制和风险管理等方面进行审核的活动。它的目的是发现潜在的问题、风险和控…

CUDA学习笔记2——CUDA程序基本框架

CUDA向量运算 CUDA程序的基本框架为: 头文件包含 常量定义/宏定义 C 自定义函数和CUDA核函数声明 int main(void) { 分配主机与设备内存 初始化主机中的数据 将部分数据从主机拷贝至设备 调用核函数在设备中进行计算 将部分数据从设备拷贝至主机 释放主机与设备内存…

采集网页数据保存到文本文件---爬取古诗文网站

访问古诗文网站(https://so.gushiwen.org/mingju/) 会显示出这个页面,里面包含了很多的名句,点击某一个名句(比如点击无处不伤心,轻尘在玉琴)就会出现完整的古诗 我们点击鼠标右键,点…

【C++设计模式之责任链模式:行为型】分析及示例

简介 责任链模式是一种行为型设计模式,它允许将请求沿着处理链传递,直到有一个处理器能够处理该请求。这种模式将请求的发送者和接收者解耦,同时提供了更高的灵活性和可扩展性。 描述 责任链模式由多个处理器组成一个处理链,每…

如何批量获取拼多多商品详情数据,拼多多商品详情API接口

批量获取拼多多商品详情数据可以采用以下方式: 使用拼多多开放平台API接口。 拼多多开放平台提供了API接口,可以通过API接口获取拼多多平台上的商品信息,使用API接口需要进行权限申请和认证,操作较为复杂。使用第三方工具。 市面…

Transformer预测 | Pytorch实现基于Transformer的锂电池寿命预测(NASA数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

网络安全(黑客)——自学篇

什么是网络安全? 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻…

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码:五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为:EP4CE6F17C8 EEPROM芯片型号为:24L…

[C++从入门到精通] 11.回顾类内初始化、默认构造函数、=default

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用seleniumphantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*-from selenium import webdriver from selenium.webdriver.common.keys import Keysimp…

辅助寄存器是干什么用的

目录 请问CPU 的 MREQ 引脚和 IORQ 引脚分别是干什么用的 那这里的引脚是什么含义呢? 程序是指令和数据的集合 辅助寄存器是干什么用的 寄存器的用途取决于它的类型 PC 寄存器也叫作“程序指针”,存储着指向 CPU 接下来 要执行的指令的地址。PC 寄存…

jmeter添加断言(详细图解)

先创建一个线程组,再创建一个http请求。 为了方便观察,我们添加两个监听器,察看结果树和断言结果。 添加断言:响应断言,响应断言也是比较常用的一个断言 设置响应断言:正常情况下响应代码是200。选择响应代…

固态硬盘删除的资料能恢复吗?

固态硬盘(SSD)作为一种存储设备,在读写速度和抗摔性方面具有显著优势,因此备受许多用户的青睐。然而,在使用过程中,由于人为误操作或设备内部故障,固态硬盘可能会导致数据丢失。所以固态硬盘删除…

【WinRAR】去除请购买WinRAR许可

新建rarreg.key文件 在WinRAR安装目录新建rarreg.key文件,文件内容如下: RAR registration datawncnUnlimited Company LicenseUID1b064ef8b57de3ae9b5264122122509b52e35fd885373b214a4a64cc2fc1284b77ed14fa2066ebfca6509f9813b32960fce6cb5ffde62890079861be57…

聊聊分布式架构02——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程:客户端浏览器通过…

slam从入门到精通(稍复杂一点的运动控制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 ros本身只是提供了一个框架,上面对应客户需求,下面对应各个传感器,中间就是各个算法和决策措施。但是robot本身…