当前位置: 首页 > news >正文

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

文章目录

  • sift特征提取
    • 一、基本原理
    • 二、特点
    • 三、代码实现
      • 1. 函数方法
      • 2. 检测图像中的关键点
      • 3. 绘制关键点
      • 4. 计算关键点描述符
      • 5. 输出特征坐标点
  • 总结

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. 如何获得特征点的信息,以便于特征匹配
http://www.lryc.cn/news/450617.html

相关文章:

  • HarmonyOS/OpenHarmony Audio 实现音频录制及播放功能
  • css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用
  • Activiti 工作流大致了解
  • 速盾:高防 CDN,网站安全的有力保障
  • 宝塔搭建nextcould 30docker搭建onlyoffic8.0
  • 【源码+文档+调试讲解】交通信息管理系统
  • 小阿轩yx-案例:Ansible剧本文件实践
  • 【ShuQiHere】深入理解微架构(Microarchitecture):LC-3 的底层实现 ️
  • Ubuntu24.04.1系统下VideoMamba环境配置
  • c++第十二章续(队列结构类模拟)
  • 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall
  • 基于ESP8266—AT指令连接阿里云+MQTT透传数据(3)
  • redis的数据结构,内存处理,缓存问题
  • 机器学习模型评估与选择
  • Web认识 -- 第一课
  • Recaptcha2 图像识别 API 对接说明
  • 6种MySQL高可用方案对比分析
  • FastAPI: websocket的用法及举例
  • JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域
  • Vue+Flask
  • 深入剖析 Android Lifecycle:构建高效稳定的应用
  • ElasticSearch分词器、相关性详解与聚合查询实战
  • 删除二叉树中以x为根节点的子树(包括根结点)
  • Netty 与 WebSocket之间的关系
  • 通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免
  • JAVA并发编程系列(13)Future、FutureTask异步小王子
  • 【python爬虫可以获取到谷歌影像吗?】如何有效下载谷歌影像?
  • Windows 上安装 PostgreSQL
  • Vue 技术进阶 day2 数据监视的原理、其他内置指令、自定义指令、生命周期、组件化、VueComponent构造函数
  • vue.js 原生js app端实现图片旋转、放大、缩小、拖拽