首页 > 其他分享 >【进阶OpenCV】 (3)--SIFT特征提取

【进阶OpenCV】 (3)--SIFT特征提取

时间:2024-10-01 14:18:43浏览次数:8  
标签:-- cv2 sift OpenCV SIFT 特征 图像 关键点

文章目录

sift特征提取

SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)特征检测是一种在图像处理和计算机视觉领域广泛使用的算法,主要用于特征点检测和特征匹配。

SIFT特征具有对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

一、基本原理

SIFT算法通过在不同尺度空间中寻找关键点,并计算这些关键点的局部特征描述子,从而实现图像的特征匹配和识别。

关键点(也称为特征点或兴趣点)是指图像中一些具有独特性和稳定性的局部特征区域。

其基本原理包括以下几个步骤:

  1. 构建尺度空间:通过对原始图像进行多次高斯模糊和降采样,构建出高斯金字塔,以在不同尺度下检测出特征点。
  2. 检测关键点:利用高斯差分(DoG)图像检测尺度空间中的极值点,这些极值点被认为是潜在的关键点。
  3. 定位关键点位置:通过泰勒展开式对DoG图像进行拟合,精确定位关键点的位置,并排除低对比度和边缘响应的干扰。
  4. 确定关键点方向:基于图像局部的梯度方向,为每个关键点分配一个或多个主方向,以保证特征描述子的旋转不变性。
  5. 生成特征描述子:在关键点周围的邻域内,测量图像局部的梯度,并将这些梯度变换成一种表示形式,生成具有128维特征向量的特征描述子。

二、特点

  1. 图像的局部特征:对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  2. 独特性好:信息量丰富,适用于海量特征库进行快速、准确的匹配。
  3. 多量性:即使是很少几个物体也可以产生大量的SIFT特征。
  4. 高速性:经优化的SIFT匹配算法甚至可以达到实时性。
  5. 扩招性:可以很方便的与其他的特征向量进行联合。

三、代码实现

原始图片:

在这里插入图片描述

1. 函数方法

  • 创建sift特征的提取对象:
cv2.SIFT_create() / cv2.xfeatures2d.SIFT_create() -----> 创建一个sift特征的提取对象
  • 检测图像中的关键点:
sift.detect(img)
  • 绘制关键点:
drawKeypoints(image,keypoints,outImage,color=None,flags=None)
参数:
-- image:原始图像
-- keypoints:从原图中获得的关键点,这也是画图时所用到的数据
-- outImage:输出图像,可以是原图也可以是None
-- color:颜色设置,更改画笔颜色
-- flags:绘图功能的标识设置
  • 计算关键点描述符:
sift.compute() ---> 输出关键点的形状和描述符的形状

2. 检测图像中的关键点

# 检测图像中的关键点
# cv2.SIFT_create() / cv2.xfeatures2d.SIFT_create() -----> 创建一个sift特征的提取对象
#sift.detect(img) -----> 在图像中查找关键点

yf = cv2.imread("tu.jpg")
yf_gray = cv2.cvtColor(yf,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create() # 创建sift对象
kp = sift.detect(yf_gray) # 查找关键点

3. 绘制关键点

yf_sift = cv2.drawKeypoints(yf,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('yf_sift',yf_sift)
cv2.waitKey(0)

在这里插入图片描述

4. 计算关键点描述符

主要用于方便后期进行特征匹配:

# 使用sift.compute()计算关键点描述符,方便后期的特征匹配
kp,des = sift.compute(yf,kp)
print(np.array(kp).shape,des.shape)
# 输出关键点的形状和描述符的形状
# np.array(kp).shape表示关键点的数量和属性
# des.shape表示描述符的数量和属性
-------------------
(764,) (764, 128)

5. 输出特征坐标点

# 输出特征点坐标
# .pt:将隐藏的坐标数据显示出来
for i in kp:
    print(f"特征点坐标为:{i.pt}")
----------------------
展示部分结果:
特征点坐标为:(5.986441612243652, 704.0958862304688)
特征点坐标为:(6.146509647369385, 192.4614715576172)
特征点坐标为:(6.952261447906494, 719.527587890625)
特征点坐标为:(11.127826690673828, 497.750732421875)
特征点坐标为:(11.127826690673828, 497.750732421875)

总结

本篇介绍了:

  1. sift特征提取的作用是描绘出图中的特征点
  2. 如何获得特征点的信息,以便于特征匹配

标签:--,cv2,sift,OpenCV,SIFT,特征,图像,关键点
From: https://blog.csdn.net/m0_74896766/article/details/142664067

相关文章

  • Leetcode 1907 按分类统计薪水
    一、题目查询每个工资类别的银行账户数量。 工资类别如下:"LowSalary":所有工资 严格低于 20000 美元。"AverageSalary": 包含 范围内的所有工资 [$20000, $50000] 。"HighSalary":所有工资 严格大于 50000 美元。结果表 必须 包含所有三个类别。 如果某个类......
  • Pyramid Interests PerfectNumber ArmstrongNumbers
    Homework2Note:Submityourwork(uploadthe.javasourcecodefilesONLY,notthecompiled.classfiles!)throughthe“Homework2”linkonBrightspace.Youmaysubmitanunlimitednumberoftimes;wewillonlygradethelast/latestsubmissionattempt,but......
  • .Net 依赖注入深入探索,做一个DI拓展,实现一个简易灵活的 自动依赖注入框架xy
    合集-.Net框架探索(2)1..NetWeb项目中,实现轻量级本地事件总线框架09-27:悠兔机场2..Net依赖注入深入探索,做一个DI拓展,实现一个简易灵活的自动依赖注入框架09-30收起一、依赖注入相关知识1.1、依赖注入的原理和优点依赖注入(DI),是IOC控制反转思想的实现。由一个DI容器,去......
  • 南沙C++信奥赛陈老师解一本通题 1983:【19CSPJ普及组】公交换乘
    ​ 【题目描述】著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:1、在搭乘一次地铁后可以获得一张优惠票,有效期为 4545 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间......
  • 每日OJ题_牛客_DP2跳台阶_动态规划_C++_Java
    目录牛客_DP2跳台阶_动态规划题目解析C++代码Java代码牛客_DP2跳台阶_动态规划跳台阶_牛客题霸_牛客网题目解析        当前值只和数组的前两个值有关,在往前面的就无关了,所以没必要申请一个数组,直接使用两个变量即可,这样空间复杂度就满足要求了。C++代码......
  • 【MySQL】MySQL 数据库主从复制详解
    目录1.基本概念1.1主从架构1.2复制类型2.工作原理2.1复制过程2.2主要组件3.配置步骤3.1准备工作3.2在主服务器上配置3.3在从服务器上配置4.监控和维护4.1监控复制状态4.2处理复制延迟4.3故障恢复5.备份策略5.1逻辑备份与物理备份5.2增量备份6.使......
  • 【Docker】Docker 容器的使用指南:如何进入容器并运行命令
    目录1.什么是Docker容器?2.进入Docker容器的方法2.1使用`dockerexec`2.2使用`dockerattach`2.3使用`dockerrun`3.常见选项与参数4.退出容器5.进入容器的实际操作步骤步骤1:查看正在运行的容器步骤2:进入容器步骤3:在容器中运行命令步骤4:退出容器6.......
  • 使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
    1、本文架构本文目标是使用微服务SpringCloud集成Kafka实现异步通信。其中KafkaServer部署在Ubuntu虚拟机上,微服务部署在Windows11系统上,KafkaProducer微服务和KafkaConsumer微服务分别注册到Eureka注册中心。KafkaProducer和KafkaConsumer之间通过KafkaServer实现异......
  • C项目--带权限的图书管理系统(1000多行代码,代码数据可下载,极其适合初学练手)
    本专栏目的更新C/C++的相关的项目前言C语言的图书权限管理系统完结(进阶的一点后面更新),1000多行代码(核心代码5、600行);本设计是一个比较综合的练习,用到数据结构(顺序表、链表、静态链表)、文件、排序、查找、字符串操作等方面的知识;由于本项目是本人一步一步边做边写笔记......
  • 字符函数和字符串函数
    一.字符转换函数C语言提供2个字符转换函数tolower  toupper       他可以转换大小写 二.strlen的使用和模拟实现字符串以\0作为结束标志,strlen返回的是在strlen前面出现的字符个数(不包含\0)strlen函数模拟实现递归的方法 创建临时变量计数器 指针......