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

article/2025/10/26 15:40:55

目录

SIFT

1、生成高斯差分金字塔,尺度空间构建

2、空间极值点检测

3、稳定关键点的精确定位

4、稳定关键点方向信息分配

5、关键点描述

6、特征点匹配


SIFT

SIFT:Scale-Invariant Feature Trainsform即尺度不变特征变换,这是一种图像处理以及计算机视觉领域里面对图像的局部特征描述的常用方法。SIFT提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置尺度和方向信息。

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),计算关键点的大小方向以及尺度信息,利用这些信息组成关键点对特征点进行描述的问题。SIFT算法所查找的关键点都是一些十分突出,不会因光照仿射变换和噪声等因素而变换的“稳定”的特征点,匹配的过程就是对比这些特征点的过程:

 

算法特征提取和匹配的具体步骤:

1、生成高斯差分金字塔,尺度空间构建

尺度空间:人的眼睛能自动调节分辨率,近距离看一个人脸能看到毛孔,距离远了看不到毛孔。但是在图片信息当中,分辨率是固定的,要想得到类似人眼的效果,就要把图片弄成不同的分辨率,制作成图像金字塔来模拟人眼的功能,从而在其他图片中进行特征识别时,能像人的眼睛一样,即使要识别的物体尺寸变大或者变小,也能够识别出来。例如:观察一棵树,如果观察的是一整棵树(相当于大尺度情况下观察),那么就应该去除图像的细节部分,如果观察的是树叶(小尺度下观察),那么就应该观察局部细节特征。

图像金字塔:把一个图片从原始分辨率不停的对其分辨率进行减少,然后将这些图片摞在一起,可以看成一个四棱锥的样式,这个东西就叫做图像金字塔。

图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像,把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像。

 获得图像金字塔的步骤:

1)利用滤波器平滑图像(高斯滤波)

2)对平滑图像进行抽样(采样):上采样是分辨率逐渐升高,下采样相反

高斯金字塔:高斯金字塔并不是一个金字塔,而是很多组金字塔构成,并且每组金字塔都包含若干层。高斯金字塔是图片在不同尺寸下进行高斯模糊操作后的图片。下图中的金字塔分为好几组,最下面一组是用不同大小的高斯核对原图像进行卷积操作得到的一组图片,倒数第二组的图片是对刚才的第一组的第三层的图片进行降采样,降采样后图片尺寸缩小了,缩小后再用不同尺度的高斯核进行卷积操作,然后得到图中倒数第二组的一组图片。金字塔的其他层以此类推得到高斯金字塔。

金字塔模拟近处物体大,远处物体小的情况,用高斯核进行卷积操作模拟的是近处物体清晰,远处物体模糊。

组数:\log_{2}\left ( min\left ( M,N \right ) \right )-3,其中M,N是原图片的长度和宽度。

每一组的层数:n+3,n是你期望提取多少张图片中的特征。

每一组里面每层每一次高斯核卷积的核大小:

 高斯差分金字塔

同一组的高斯金字塔里面的图片大小尺寸是一样的,然后把同一组相邻两层的图片相减得到高斯差分金字塔,就是下图中右边蓝色的部分。

2、空间极值点检测

特征点是由局部极值点组成的,为了寻找极值点,每一个像素要和它所有相邻的点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图 :中间的×这个监测点和它同尺度的8个相邻点以及上下相邻尺度对应的9*2个点共26个点 比较,以确保在尺度空间和二维图像空间都检测到极值点。

3、稳定关键点的精确定位

第二步中的检测到的局部极值点还要经过进一步的筛选,去除掉不稳定和错误检测出的极值点。

利用阈值的方法来限制,在opencv中为contrastThreshold。

4、稳定关键点方向信息分配

稳定的极值点是在不同尺度空间下提取的,这保证了关键点的尺度不变性。为关键点分配方向信息所要解决的问题是使得关键点对图像角度和旋转具有不变性。

方法:获取关键点所在尺度空间的领域,然后计算该区域的梯度和方向,根据计算得到的结果创建方向直方图。可以做如下设定:直方图的峰值为主方向的参数,其他高于主方向百分之80的方向被判定为辅助方向。

5、关键点描述

对于每一个关键点,都拥有尺度、位置以及方向三个信息,所以具备平移、缩放和旋转不变性。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变。

描述的思路是:对关键点周围像素区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象表述。

如下图,对于2*2块,每块最终取8个方向,既可以生成2*2*8维度的向量,以这22*2*8维向量作为中心关键点的数学描述。

实验结果表明:对于每个关键点采用4*4*8=128维向量表征,综合效果最优。

 

6、特征点匹配

特征点的匹配是通过计算两组特征点的128维的关键点的欧氏距离实现的。

欧氏距离越小,则相似度越高,当欧氏距离小于设定的阈值时,可以判定为匹配成功。

具体步骤:

1、分别对模板图和实时图建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。

2、匹配可采取穷举法完成。


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

相关文章

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…

【uniapp】页面下拉刷新

目录 一、全局 二、局部 1、一个页面一个下拉刷新 2、一个页面多个下拉刷新&#xff08;切换时滚动条回到顶部&#xff09; 3、一个页面多个下拉刷新&#xff08;切换时恢复滚动条位置&#xff09; 一、全局 修改pages.json的"enablePullDownRefresh": true, …

uniapp 下拉刷新

uniapp 下拉刷新&#xff08;全局&单页面&#xff09; 全局设置 在pages.json文件的globalStyle对象中开启enablePullDownRefresh属性 单页面 在pages.json文件中的pages数组中找到对应的页面&#xff0c;在对应页面的style属性中开启enablePullDownRefresh属性 下拉刷…

Android 下拉刷新框架实现

前段时间项目中用到了下拉刷新功能&#xff0c;之前在网上也找到过类似的demo&#xff0c;但这些demo的质量参差不齐&#xff0c;用户体验也不好&#xff0c;接口设计也不行。最张没办法&#xff0c;终于忍不了了&#xff0c;自己就写了一个下拉刷新的框架&#xff0c;这个框架…

Android中实现下拉刷新

需求&#xff1a;项目中的消息列表界面要求实现类似sina微博的下拉刷新&#xff1b; 思路&#xff1a;一般的消息列表为ListView类型&#xff0c;将list加载到adapter中&#xff0c;再将adapter加载到ListView中&#xff0c;从而实现消息列表的展示。而下拉刷新要求给消息列表…

微信小程序下拉刷新

一、如何设置微信小程序所有页面都可以下拉刷新呢&#xff1f; 1、在app.json的"window"中进行配置 &#xff08;1&#xff09;把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” &#xff08;2&#xff09;添加"enab…

下拉刷新上拉加载

目录 原理实现效果 原理 想必使用过微信开发工具的应该都接触过上拉加载下拉刷新配置。 原理呢就是通过根据当前刚开始触碰的屏幕垂直y轴距离和滑动时所触碰垂直y轴距离&#xff0c;从而来判断是上拉&#xff0c;下拉。 实现 使用的vue2 封装的组件&#xff0c;js大致思路是…

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到ListView下拉刷新的功能&#xff0c;一开始想图省事&#xff0c;在网上直接找一个现成的&#xff0c;可是尝试了网上多个版本的下拉刷新之后发现效果都不怎么理想。有些…

【Demo】教你实现下拉刷新

前言 第三方库很常见&#xff0c;我们开发需求的时候经常会用到下拉刷新组件&#xff0c;如果要我们自己实现下拉刷新该如何实现尼&#xff1f; 效果 实现原理 1、监听 touchstart事件记录初始startY 2、监听 touchmove事件 e.touches[0].pageY - startY得到 deltaY&#xf…