SIFT算法步骤梳理

article/2025/10/26 15:18:20

简介:SIFT算法是检测和描述局部特征的一种方法,具有尺度不变性,对于光线,噪声等的容忍度相当高。即便少数几个物体也可以产生大量SIFT特征。

SIFT算法实质上是在不同尺度空间上查找关键点,并计算出关键点的方向。

算法步骤:

1.构建尺度空间

  •  利用高斯核来构建
    • 高斯核是唯一可以产生多尺度空间的核,也是唯一线性核,利用高斯核对图像模糊处理不会引入其他噪声。
    • 高斯核函数:

  • 输入图像通过高斯核函数连续的对尺度进行参数变换,最终得到多尺度空间序列。图像中某一尺度的空间函数由高斯函数和原输入图像I(x,y)卷积得出:

  • 高斯金字塔
    • 模仿图像的不同尺度
    • 生成步骤:高斯平滑-->对图像做下采样(一般先将图像扩大一倍,在扩大的图像基础上构建高斯金字塔,然后您对该尺寸下图像进行高斯模糊,几幅模糊的图像集合构成了一个八度,然后对该八度下倒数第三张图片进行下采样,长和宽分别缩短一倍,图像面积变为原来的四分之一。以此类推)
    • 为什么选倒数第三张进行下采样?为了保持尺度空间的连续性,根据下图公式可以计算得出第o组第S层的图像尺度,可以发现下一组的第o层图像恰好和上一组倒数第三张图一致,所以每一组的第0张图像只需要用上一层的倒数第三张进行下采样即可。

2.DoG

  • Laplace operator:二阶导

  • LoG(Laplace of Gaussian)
    • 把拉普拉斯算子和高斯函数联合到了一个步骤
    • 等价于先对高斯函数求二阶导,再与原图进行卷积

将高斯拉普拉斯算子展开:

又有:

  • DoG:对不同尺度下的高斯函数的差分

DoG算子为

DoG算子和LoG算子具有类似的波形,且计算复杂度低,所以一般用DoG代替LoG算子。

  • DoG vs LoG

  • 高斯差分图像

3.DoG定位极值点

  • 特征点是由DoG空间的局部极值点组成的。
  • 每一个像素要和他所有的相邻点比较(中间的监测点和它同尺度的8个相邻点和上下相邻尺度对应的9*2个,共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点)
  1. 确定潜在特征点
  • 检测到的局部极值点A(x,y,σ)是离散情况下的一个极值点,如果考虑连续情况,则极值点可能落在了A点的附近(Δx,Δy,Δσ)(如下图所示),而真正的极值点B可以表示为在点A处的泰勒展开。

令上面D(x)的一阶导数为0,可以得到

  • 对以上过程进行多次迭代(最多5次)得到最终候选点的精确位置.(偏移超过0.5时更新当前像素点,若没有超过0.5,则当前像素加上偏移就是精确点)

4.边缘和低对比度响应(移除某些特征点)

  • 移除低对比度的点:D(X')小于0.03的点
  • 移除边缘点:利用hessian矩阵

5.确定关键点方向

  • 利用特征点领域像素的梯度来确定其方向参数
    • 对于已经检测到的特征点,已知其尺度σ,可以确定该尺度下的高斯图像

  • 梯度方向

  • 梯度幅值

  • 利用图像的梯度直方图求取关键点局部结构的稳定方向
    • 以关键点为原点,一定区域内的图像像素点对关键点方向生成所做的贡献。
    • 构建梯度直方图,梯度方向决定位于直方图的哪个槽(共36个槽,每10度划分一个),幅值加权更新槽内幅值的和。

6.构建关键点描述子(keypoints descriptor)

  • 校正主方向,确保旋转不变性
    • 以特征点为中心,将坐标轴旋转到特征点的主方向
  • 生成描述子,形成128维的特征向量
    • 基于梯度方向直方图,每45度一个划分,共划分8个槽
    • 在每个4*4的小方块内绘制8个方向的梯度直方图,计算幅值,即形成一个种子点
    • 对每个关键点使用16个种子点来描述,每个种子点有8个方向的信息,即形成了128为特征向量

  • 归一化处理特征向量的长度,进一步去除光照的影响。

参考博文:

SIFT特征详解 - Brook_icv - 博客园

SIFT解析(二)特征点位置确定 - DreamFaquir - 博客园

SIFT解析(三)生成特征描述子_honpey爱编程-CSDN博客

SIFT定位算法关键步骤的说明 - ☆Ronny丶 - 博客园


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

相关文章

SIFT算法原理详解及代码实现(笔记)

一、SIFT算法概述: SIFT(Scale Invariant Feature Transform)全称尺度不变特征变换,SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集&#xf…

SIFT算法 特征匹配

目录 一、SIFT算法DOG尺度空间构造(Difference of Gaussian)关键点搜索与定位方向赋值、关键点描述 二、特征匹配 一、SIFT算法 参考链接 【OpenCV】SIFT原理与源码分析 DOG尺度空间构造(Difference of Gaussian) 首先是对原特…

SIFT算法详解——图像特征提取与匹配

文章目录 前言一、建立高斯差分金字塔1、建立高斯金字塔2、建立高斯差分金字塔3、建塔过程中参数的设定及相关细节问题 二、关键点(key points)位置确定1、阈值化2、在高斯差分金字塔中找极值点3、调整极值点位置4、舍去低对比度的点5、边缘效应的去除(难点&#xf…

非常详细的sift算法原理解析

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自:http://blog.csdn.net/zddblog/article/details/7521424 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 1、SIFT综…

【Python】:SIFT算法的实现

✨博客主页:米开朗琪罗~🎈 ✨博主爱好:羽毛球🏸 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深…

SIFT算法原理

SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算法特点: 1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放…

计算机视觉——SIFT算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、SIFT算法特点二、SIFT算法实质三、SIFT算法实现特征匹配主要有以下流程:1、**特征点位置和尺度的提取**:2、**特征点方向的提取**3、…

SIFT(尺度不变特征变换)算法

目录 SIFT 1、生成高斯差分金字塔,尺度空间构建 2、空间极值点检测 3、稳定关键点的精确定位 4、稳定关键点方向信息分配 5、关键点描述 6、特征点匹配 SIFT SIFT:Scale-Invariant Feature Trainsform即尺度不变特征变换,这是一种图像…

SIFT算法

1. SIFT简介 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表&#xff…

SIFT算法详解(附有完整代码)

说明:本文旨在给出 SIFT 算法的具体实现,而在 SIFT 详解上只是做出简单介绍,在这里可以给大家推荐一篇好文:https://blog.csdn.net/zddblog/article/details/7521424;结合这篇文章和下文的具体代码实现,我相…

SIFT算法详解

大纲 引言一、高斯金字塔二、高斯差分金字塔三、特征点处理1.阈值化2.非极大值抑制3. 二阶泰勒修正4.低对比度去除5.边缘效应去除 四、特征点描述子1. 确定特征点区域方向2. 特征点区域描述子 总结参考: 引言 SIFT算法是为了解决图片的匹配问题,想要从图…

全网最详细SIFT算法原理实现

文章目录 一、SIFT算法1.1什么是SIFT算法?1.2SIFT算法特点 二、SIFT算法实质2.1SIFT算法实现特征匹配主要有以下三个流程: 三、SIFT算法原理3.1图像金字塔3.2创建图像高斯金字塔3.3高斯金字塔创建总图 四、尺度空间五、高斯差分金字塔5.1极值点(Key poin…

uniapp如何下拉刷新?其实简简单单

uniapp如何上拉刷新?其实简简单单 不论是微信小程序和app上拉刷新功能都是非常常用的,可以说是每个app的标配。 文章目录 uniapp如何上拉刷新?其实简简单单第一步:1.1app全局开启下拉刷新1.2 app中单个页面开启下拉刷新 第二步2.…

uni-app(9)— 下拉刷新以及关闭下拉刷新,上拉加载(页面触底)

此文为uni-app总结笔记(9)— 下拉刷新以及关闭下拉刷新,上拉加载(页面触底) 下拉刷新 开启下拉刷新 在uni-app中有三种方式开启下拉刷新 方法一: 需要在 pages.json 里,找到的当前页面的pag…

上拉刷新和下拉刷新的实现

先来两张效果图 关于下拉刷新,Google提供了一个布局SwipRefreshLayout,它里面可以包涵一个滑动控件,然后你可以设置它的刷新事件就OK了,非常简单用。但是上拉刷新就有点麻烦了。网上很多方法都是给recyclerview添加footer的方法,我…

Flutter 实现下拉刷新和上拉加载

参考 Flutter下拉刷新和上拉加载更多 下拉刷新 上拉加载更多 下拉刷新直接用flutter自带的控件RefreshIndicator组件即可,上拉加载可以通过ListView 中的ScrollController 属性,根据 ListView 的位置来判断是否滑动到了底部来做加载更多的处理 下面用们用…

iOS 下拉刷新

移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的数据也用的非常多,最典型的就…

uniapp几种实现下拉刷新的方式

一.自带刷新 1.在pages.json 上进行定义 2.在页面上监听下拉动作进行需要的操作 ps:一定要手动停止刷新,否则会一直刷新 自带刷新的优点:相对稳定,写法相对简单 自带刷新的缺点:样式上固定的 所以不能满足全部人的需…

小程序下拉刷新的实现

小程序下拉刷新 1.使用onPullDownRefresh()这个方法来实现下拉刷新 例子如下: // 下拉刷新onPullDownRefresh: function () {wx.showNavigationBarLoading() //在标题栏中显示加载图标setTimeout(() > {wx.hideNavigationBarLoading(); //完成停止加载wx.stopP…

Android 下拉刷新实践

1. 手动实现一个下拉刷新功能。 2. 效果图&#xff1a; 3. view结构 4.实现思路 <com.luocc.tim.recycler.RefreshLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"vertical"><Tex…