图像处理:局部描述子SIFT算法

article/2025/9/30 21:26:25

目录

0、关于SIFT的介绍

1、兴趣点

2、描述子 

SIFT算法实现

1.实例化sift

2.利用sift.detectAndCompute()检测关键点并计算

3.将关键点检测结果绘制在图像上

Opencv实现

总结


0、关于SIFT的介绍

SIFT,即尺度不变特征变换,一种局部特征描述子,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。SIFT特征包括兴趣点检测器和描述子。SIFT描述子具有非常强的稳健性,这在很大程度上也是SIFT特征能够成功和流行的主要原因。自从SIFT出现后,许多与他本质上使用相同描述子的方法也相继出现。现在,SIFT描述符常和许多不同的兴趣点检测器相结合,有时甚至在整幅图像上密集使用。SIFT特征对于尺度、旋转和亮度都具有不变性,因此,它可以用于三维视角和噪声的可靠匹配。

1、兴趣点

高斯核是唯一可以产生多尺度空间的核函数——《Scale-space theory:A basic tool for analysing structures at different scales》

SIFT是采用高斯差分函数来定位兴趣点:

              D(x,\sigma )=[G{\underset{k\sigma}{}}(x)-G{\underset{\sigma}{}}(x)]*\mathit{I}(x))=[G{\underset{k\sigma}{}}-G{\underset{\sigma}{}}]*\mathit{I}=\mathit{I{\underset{k\sigma}{}}-}\mathit{I{\underset{\sigma}{}}}

其中:

sigma为尺度空间因子,它决定了图像的模糊的程度。大尺度表现得是图像得概貌信息,小尺度表现得是图像得细节信息。

G{\underset{\sigma}{}}是指二维的高斯核,也就是G(x,y)=\frac{1}{2\pi\sigma ^{2} }\mathrm{e}^{-\frac{(\mathit{x^{2}}+\mathit{y^{2}})}{2\sigma ^{2}}}大家对于它应该还是比较熟悉吧;

\mathit{I{\underset{\sigma}{}}}是使用G{\underset{\sigma}{}}模糊的灰度图像;

k是决定相差尺度的常数。

兴趣点是在图像位置和尺度变化下 D(x,σ) 的最大值和最小值点。这些候选位置点通过滤波去除不稳定点。基于一些准则,比如认为低对比度和位于边上的点不是兴趣点,这样可以去除一些候选的兴趣点。

2、描述子 

        上面讨论的兴趣点(关键点)位置描述子给出了兴趣点的位置和尺度信息。为了实现旋转不变性,基于每个点周围图像梯度的方向和大小,SIFT 描述子又引入了参考方向。SIFT 描述子使用主方向描述参考方向。主方向使用方向直方图(以大小为权重)来度量。

        下面我们基于位置、尺度和方向信息来计算描述子。为了对图像亮度具有稳健性,SIFT 描述子使用图像梯度。下图所示为描述子的构造过程。

        SIFT描述子会以每个像素点附近选取一个网格(标准为4*4),在每个子区域当中计算梯度方向直方图,每个子区域拼接起来组成描述子向量,而每个子区域的直方图拼接起来组成描述子向量,每个子区域使用 8 个小区间的方向直方图,会产生共128 个小区间的直方图(4×4×8=128)。

图解:

  (a)  一个围绕兴趣点的网格结构,其中该网格已经按照梯度主方向进行旋转

  (b)  在网格的一个子区域内构造梯度方向的8-bin直方图

  (c)  在网格的每个子区域内提取直方图

  (d)  拼接直方图,得到一个长的特征向量

SIFT算法实现

1.实例化sift

sift = cv2.xfeatures2d.SIFT_create()

2.利用sift.detectAndCompute()检测关键点并计算

kq, dst = sift.detectAndCompute(gray, None)

参数:

  • gray:进行关键点检测的图像,注意要是灰度图像

返回:

  • kp:关键点信息,包括位置,尺度,方向信息
  • des:关键点描述符,每个关键点对应128个梯度信息的特征向量

3.将关键点检测结果绘制在图像上

cv2.drawKeypoints(pic2, kq, pic2, (0, 0, 255),

参数:

image:原始图像

keypoints:关键点信息,将其绘制在图像上

outputimage:输出图片,可以是原始图像

color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。

flags:绘图功能的标识设置

  1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像匹配对和特征点,对每一个关键点,对每一个关键点只绘制中间点.
  2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对。
  3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形。
  4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制。

Opencv实现

import cv2
import matplotlib.pyplot as plt# 1.读取灰度图像
pic1 = cv2.imread("Elon test.png")
gray = cv2.cvtColor(pic1, cv2.COLOR_BGR2GRAY)
# 2.SIFT实例化
sift = cv2.xfeatures2d.SIFT_create()
# 3.检测关键点
kq, dst = sift.detectAndCompute(gray, None)
# 4.绘制关键点
pic2 = pic1.copy()
cv2.drawKeypoints(pic2, kq, pic2, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)  # flags=4可以替换cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
# 绘制图像
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
axes[0, 0].set_title("original")
axes[0, 0].imshow(pic1[:, :, ::-1])
axes[0, 1].set_title("gary_scale")
axes[0, 1].imshow(gray, plt.cm.gray)
axes[1, 1].set_title("SIFT_feature_detect")
axes[1, 1].imshow(pic2[:, :, ::-1])
plt.show()
cv2.waitKey(0)

 

注:代码来源于黑马教程以及ζั͡ ั͡雾 ั͡狼 ั͡✾的博客(26条消息) [图像识别]10.OpenCV的特征点检测 SIFT和SURF算法_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客_opencv sift目标检测

这里还有保姆级的,大家感兴趣的可以去学习,我只是作为了解。

(1条消息) Python实现SIFT算法,附详细公式推导和代码_Derle3er的博客-CSDN博客_python sift

总结

SIFT在图像的不变特征提取拥有无与伦比的优势,但并不完美,仍然存在实时性不高,有时特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷。


http://chatgpt.dhexx.cn/article/Ox1WayKp.shtml

相关文章

SIFT3D点云关键点提取详细介绍

1.引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的,类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的,这些点云特征在PCL库中都有具体的实现。Harris3D和Harris6D目前已经有很好的博客和视频讲解了但是SIFT3D却没有一个比较好的介…

java sift 图片相似度,简单快速的图像相似性比较方法

我最近也面临同样的问题,为了解决这个问题(简单快速的算法比较两个图像),我贡献了 img_hash module 要打开“控制”,您可以从 this link . img_哈希模块提供六种图像哈希算法,非常容易使用。 代码示例 起源Lena 模糊莉娜 调整Lena的大小 移动Lena #include #include #include…

图像特征提取(二)——SIFT算法详解

转载自:http://blog.csdn.net/zddblog/article/details/7521424尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT)Just For Fun zdd zddmailgmail.com or (zddhubgmail.com) 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟…

Matlab实现sift特征检测+图像拼接

Matlab实现sift特征检测图像拼接共有12个m文件,其中main为主程序,点击运行即可。 一、部分代码示例 close all; clear; clc;im1imread(test3.png); im2imread(test4.png);gray1img2gray(im1); gray2img2gray(im2);[des1,loc1]sift(gray1); [des2,loc2]…

sfm算法之三角化(三角测量)

sfm算法流程一般是特征点提取、特征点匹配、计算本质矩阵/基础矩阵,最后三角化。但是利用机械臂去观察周围,前后帧姿态变化参数是具有的,所以不需要通过基础矩阵获取。 即利用机械臂的信息直接进行深度估计。已知:手眼标定、相机外…

简述人脸识别技术

简介 人脸识别技术是一种生物识别技术,可以用来确认用户身份。人脸识别技术相比于传统的身份识别技术有很大的优势,主要体现在方便性上。传统的身份认证方式诸如:密码、PIN码、射频卡片、口令、指纹等,需要用户记住复杂密码或者携…

Python机器视觉--OpenCV进阶(核心)-边缘检测之SIFT关键点检测

SIFT关键点检测 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 …

图像特征与描述子(直方图, 聚类, 边缘检测, 兴趣点/关键点, Harris角点, 斑点(Blob), SIFI, 纹理特征)...

1.直方图 用于计算图片特征,表达, 使得数据具有总结性, 颜色直方图对数据空间进行量化,好比10个bin 2. 聚类 类内对象的相关性高 类间对象的相关性差 常用算法:kmeans, EM算法, meanshift&#…

SIFI尺度不变特征变换算法

SIFT 尺度不变特征变换算法 David Lowe关于Sfit算法,2004年发表在Int. Journal of Computer Vision的经典论文中,对尺度空间(scal space)是这样定义的 : It has been shown by Koenderink (1984) and Lindeberg (1994) that un…

Opencv图像识别从零到精通(34)---SIFI

一、理论知识 Scale Invariant Feature Transform,尺度不变特征变换匹配算法,对于算法的理论介绍,可以参考这篇文章http://blog.csdn.net/qq_20823641/article/details/51692415,里面很详细,可以更好的学习。这里就不多…

32-SIFI特征点提取(EmguCV学习)

文章目录 RecordCode效果 Record 1、特征点检测与匹配常用的算法:FAST(FastFeatureDetector)、STAR(StarFeatureDetector)、SIFT、SURF、ORB、MSER、GFTT(GoodFeaturesToTrackDetector)、HARRI…

SIFI特征点提取

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmailgmail.com 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 1、SIFT综述 尺度不变特征转换(Scale-invariant feature tr…

图像SIFI笔记

Image/userl representation > down screen tasks 端到端的 文本领域 字典 visual word本质是 local feature handcraft feature 希望这个具有足够的泛华性 generalize 为了有交集 泛化性 clustering 聚类 Quantization 量化 每张图像 有特征点 local feature sift(128d维…

特征点匹配(SIFI)

1.SIFI https://blog.csdn.net/weixin_38404120/article/details/73740612(参考了这个作者的内容) 结合书上加博客的内容进行理解; 求取SIFI特征的步骤: 首先要对图像归一化,然后将图像扩大为原来的两倍&#xff0…

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变实验代码,并比较SIFI和ORB提取特征点的速度

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变 一、SIFI算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 二、ORB算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 三、比较SIFT和ORB的尺度旋转,…

向量范数简述

向量范数:表征在向量空间中向量的大小 一般表示:,其中X是n维向量,一般如果省略下面的p且无特别说明的话,指的就是2范数,也叫欧几里得范数。对向量来说,就是指向量的模。 常用的向量范数: 0范…

欧几里得范数/欧几里得距离(L2范数)

首先m维空间的概念: Rm的距离结构: 2维平面空间: m维空间: 范形空间距离 n维矢量空间中的元素X的Lp范数: 其中X是一连串的向量 最常用的是L2范数: 本质是一个距离概念 参考:《数学分析》

概念理解_L2范数(欧几里得范数)

L2范数 L2范数、欧几里得范数一些概念。 首先,明确一点,常用到的几个概念,含义相同。 欧几里得范数(Euclidean norm) 欧式长度 L2 范数 L2距离 Euclidean norm Euclidean length L2 norm L2 distance norm 对于一…

0范数,1范数,欧几里得范数等范数总结

以下分别列举常用的向量范数和矩阵范数的定义。 向量范数 1-范数: 即向量元素绝对值之和,matlab调用函数norm(x, 1) 。 2-范数: Euclid范数(欧几里得范数,常用计算向量长度),即向量元素绝对值…

范数、正则化、归一化、标准化

在总结正则化(Regularization)之前,我们先谈一谈正则化是什么,为什么要正则化。 个人认为正则化这个字眼有点太过抽象和宽泛,其实正则化的本质很简单,就是对某一问题加以先验的限制或约束以达到某种特定目的…