SIFT学习笔记(结合matlab源码)

2023-05-16

源码下载地址:https://download.csdn.net/download/u014509577/11011793

一、算法流程

1、生成高斯金字塔,并由此生成差分高斯金字塔(DoG),该过程完成尺度空间的构建,以便后续的空间极值点检测。

2、稳定关键点的精确定位、去除不稳定特征点

3、稳定关键点信息分配

4、关键点匹配

二、算法中每一步的算法原理以及源码解释

(一)构建尺度空间

(1)尺度空间及尺度空间的连续性

尺度空间:通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,以便对尺度空间的主轮廓提取,获得特征向量,实现边缘、角点检测和不同分辨率上的特征提取。

        高斯核是唯一产生多尺度空间的核,使用高斯核对图像模糊不会引入噪声,因此用高斯核构建图像尺度。

 

     一个图像的尺度空间定义为一个变换尺度的高斯函数和原图像的卷积,即

 

 

 

      其中,,m,n表示高斯模板的维度(确定)。(x, y)代表图像的像素位置。是尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。

     尺度空间,O代表第几个八度(组),S代表八度中的第几层。

      尺度空间是自然存在的,不是人为创造的!!高斯卷积只是表现尺度空间的一种形式。                                                       

     为了让尺度体现其连续性,在简单下采样的基础上添加了多尺度的高斯滤波。一幅图像可以产生几组(Octave)图像,一组图像又包括几层(Interval)图像,并且组数和金字塔的层数相等。

 

      通过在每个八度中多构造三幅高斯图像,达到了尺度空间连续的效果,这一效果带来的直接的好处是在尺度空间的极值点确定过程中,我们不会漏掉任何一个尺度上的极值点,而是能够综合考虑量化的尺度因子所确定的每一个尺度!

 

(2)构建高斯金字塔

     图像金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,自底向上构成的塔状模型。原始图像为金字塔的第一层,每次降采样得到的新图像为金字塔的一层(每层一张图像)。

高斯金字塔共包含O组图像,每组图像有 S+3S+3 层,,其中M,N分别为原始图像的行数和列数。

构建组的过程:

①扩大图像

②在该尺度上进行高斯模糊,构成一个八度(简单地说八度就是在特定尺寸(长宽)下,经不同高斯核模糊的图像的集合。八度的集合是高斯金字塔。)

③在该八度下最模糊的一幅画降采样,并成为下一个八度的初始图像。

 

(3)构建差分高斯金字塔

1、步骤:①对同八度的两幅相邻的图像做差得到插值图像

      ②所有八度的插值图像集合构成差分高斯金字塔

2、意义:差分高斯函数是尺度规范化的高斯拉普拉斯函数的近似,而高斯拉普拉斯函数的极大值和极小值点是一种非常稳定的特征点(与梯度特征、Hessian特征和Harris角点相比)有了这些基础,就可以放开手脚从差分高斯金字塔中找点了!

 

(二)稳定关键点的精确定位

(1)关键点

关键点是一些十分突出的点,它不会因光照条件的改变而消失,如焦点、边缘点、暗区域的亮点以及亮区域的暗点。关键点是在不同的尺度空间的图像下检测出的具有方向信息的局部极值点,特征点的三个特征是:尺度、方向、大小

匹配工作就是:提取两幅图片各自的稳定点,然后建立这些点之间的匹配关系。

(2)阈值检测

由于不能保证图片就是完全没有噪声的,所以在推选之前我们要排除一些对比度比较低的点,这些点很不稳定,容易受到干扰,本着宁缺毋滥的原则,先把不稳定因子排除。这个阈值一般是自己设定的,在matlab中设定它为:0.5*T/S,这里的T lowe 定义它为0.04,s是该点所在的层。

 

(3)极值检测

在sift算法里面极值点的检测方法是对图像中的每一个点进行遍历,判断每一个点是否是极值,判断的标准是,把这个点与相邻的层,上下层9+9=18个点和同一层中8个点,共18+8=26个点进行比较,看这个点是否是最大值,还是最小值,若是,则保留下来进入下一层计算。

 

(4)极值点精确定位——拟合+去除边缘状的点(去除边缘相应)

            

 

      计算机中存储的图像数据是离散的,而我们之前找到的极值点也就是离散空间中的极值点,但是离散空间中的极值点并不是真实的连续空间中的极值点。所以在这一轮的选举中,我们的目标就是找到精确的极值点(成仙之前当然要经过考验)其实这里的精确点的位置,是一个亚像素级别的概念,比如一个数的个位十位百位都确定了,要更加精细的去找这个数的小数点后的那个数据,所以首先用插值来计算。

      

 

       需要对DoG空间进行拟合处理,以找到极值点的精确位置和尺度。通过三元二次函数拟合来精确确定关键点的位置和尺度。高数中提过,函数f(x)在x0处可以进行泰勒展开。于是我们也在这个检测到的极值点处处,对它进行泰勒级数展开(这里只展开到二阶项,高次项砍掉),以此来拟合这个三维二次函数。于是得到

 

 

       把上面的式子写成矢量的形式:。于是就拟合出来了该点附近的函数了,表示拟合之后连续空间下面的插值点坐标,设则表示:相对于插值中心的偏移量,可以用偏移量表示:

                                                        

        

      对式子求导,得,让导数等于0,就可以得到极值点下的相对于插值中心的偏移量:,把该式代入可以得到该极值点下的极值为。Ok,其实到这里,已经把精确的极值点找到了!!

       一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。DOG 算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。

      

 

(三)稳定关键点信息分配

要想进行特征点匹配需要知道特征点的描述向量。之前检测中能解决尺度变化问题,接下来想通过描述来解决旋转问题。旋转的解决方法是寻找一个主方向,这样其他方向可以根据离这个主方向的角度来确定。

(1)寻找主方向。

在特征点附近的一个邻域(圆形区域)内计算每个点的梯度幅值和角度,根据角度作为横坐标计算直方图,直方图纵坐标为幅值的叠加,选取纵坐标最大的方向作为特征点的主方向。

(2)选取主方向后需要得到描述子,为了消除旋转影响,首先将特征点附近需要考虑的邻域根据主方向进行旋转:

         

然后将这个邻域分为四个子区域(也可以是16个),每个子区域包含4*4区域,每个像素都有梯度方向,利用直方图统计每个子区域在8个方向的梯度值大小的统计值:

      这样每个子区域就有8维的向量,连起来就是32维向量,如果是16个子区域就是128维向量,也就是SIFT描述子。 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方参数,使算子具备旋转不变性。

为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。

 

      梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱。随着距中心点越远的领域其对直方图的贡献也响应减小.Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。

      在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向。

 

                                                

                                                                                         直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向

                                            

 

由梯度方向直方图确定主梯度方向

 

该步中将建立所有scale中特征点的描述子(128维)

 

(四)关键点匹配

关键点的匹配主要是通过将des1中的每一个关键点信息与des2中的每一个关键点求最近邻距离,并通过阈值的限定来进行的。




 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SIFT学习笔记(结合matlab源码) 的相关文章

  • DenseNet算法详解

    论文 xff1a Densely Connected Convolutional Networks 论文链接 xff1a https arxiv org pdf 1608 06993 pdf 代码的github链接 xff1a https
  • linux网关下的TC控速

    控制上传下载速度理论方面的相关记录 1 对于TC限速配置方面 xff0c 最关键的要明白 xff0c TC限速实际上是在分析每个经过的IP数据包 xff0c 根据我们给定的限速规则 xff0c 将不同的IP数据包归入到不同的分类中 xff0
  • July 17th 模拟赛C T3 Circle Solution

    空降题目处 外网 点我点我点我 空降题目处 内网 点我点我点我 Description 给定三个点 xff08 不共线 xff09 的坐标 xff0c 要求以这三个点为圆心做三个圆 xff0c 圆两两不相交 xff0c 不包含 xff0c
  • 损失函数改进之Large-Margin Softmax Loss

    最近几年网络效果的提升除了改变网络结构外 xff0c 还有一群人在研究损失层的改进 xff0c 这篇博文要介绍的就是较为新颖的Large Margin softmax loss xff08 L softmax loss xff09 Larg
  • 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

    我们知道卷积神经网络 xff08 CNN xff09 在图像领域的应用已经非常广泛了 xff0c 一般一个CNN网络主要包含卷积层 xff0c 池化层 xff08 pooling xff09 xff0c 全连接层 xff0c 损失层等 虽然
  • XNOR-Net算法详解

    论文 xff1a XNOR Net ImageNet Classification Using Binary Convolutional Neural Networks 链接 xff1a https arxiv org abs 1603 0
  • PyTorch源码解读之torch.utils.data.DataLoader

    PyTorch中数据读取的一个重要接口是torch utils data DataLoader xff0c 该接口定义在dataloader py脚本中 xff0c 只要是用PyTorch来训练模型基本都会用到该接口 xff0c 该接口主要
  • PANet算法笔记

    论文 xff1a Path Aggregation Network for Instance Segmentation 论文链接 xff1a https arxiv org abs 1803 01534 这篇是CVPR2018关于实例分割
  • Ubuntu 18.04 LTS安装vncserver虚拟网络控制台

    虚拟网络控制台 xff08 VNC xff09 是一个图形桌面共享软件 xff0c 允许您使用键盘和鼠标远程控制另一台计算机 系统环境 服务端 xff1a Ubuntu 18 04 Server LTS客户端 xff1a Windows10
  • 轻松使用 Debian的Linux

    Spiral Linux 就是这样一种发行版 xff0c 它源于 Debian 它的重点在于促进简单性并为最终用户提供开箱即用的特性和功能 如果您是开源操作系统的新手 xff0c 并且想熟悉一个易于使用的 Linux 发行版 xff0c 那
  • 手残也不该敲的命令

    Linux命令是一种很有趣且有用的东西 xff0c 但在你不知道会带来什么后果的时候 xff0c 它又会显得非常危险 所以 xff0c 在输入某些命令前 xff0c 请多多检查再敲回车 rm rf rm rf是删除文件夹和里面附带内容的一种
  • Linux 基金会宣布成立 TLA+ 语言基金会

    Linux 基金会宣布成立 TLA 43 基金会 TLAF xff0c 以促进 TLA 43 编程语言及其 TLA 43 从业者社区的采用和发展 TLA 43 基金会的创始成员包括 AWS 甲骨文和微软 TLA 43 Temporal Lo
  • Linux的这七大认识误区,你千万别有!

    本文罗列了大家对Linux的七大认识误区 xff0c 看看其中那个是你也出现过的 千万别让这些先入为主的观点断送了你体验新事物的机会 Linux的受众群体并不大 对还是错 错 xff01 大错而特错 我承认 xff0c Linux的实际用户
  • oracle隔离级别深究追根

    oracle数据库 xff0c 只有两种隔离级别 xff1a read committed和serializable 简单的说 xff0c read committed是语句级隔离 xff0c serializable是事务级隔离 xff0
  • Solus Linux 改变发展方向

    Solus 是一个独立开发的 Linux 发行版 xff0c 它的一大特色就是 Solus 自创的 Budgie 桌面环境 xff08 最新的 Fedora 也已经新增了这个桌面环境 xff09 xff0c 当然用户也可以选择其他常见的 G
  • uptime 命令介绍

    Linux 小白 xff0c 若对系统管理有兴趣 xff0c 或想成为资深用户 xff0c 就需要对命令行有扎实的功底 你需要知道很多命令 xff0c 其中一个就是 uptime 文本我们会通过一些容易理解的案例来讲解一下这个命令的基本用法
  • 解决CentOS添加新网卡后找不到网卡配置文件

    使用VMware Workstation虚拟机安装好CentOS7虚拟机后 xff0c 添加网卡后CentOS 7无网卡配置文件的问题 xff0c 添加第二块网卡以后 xff0c 进入CentOS 7系统后 xff0c 看不到网卡配置文件
  • 详解将FTP映射至Windows

    在经常使用ftp传输文件的环境中 xff0c 每次上传和下载文件都需要重新连接然后登录是非常繁琐的一件事情 我们可以将FTP空间映射到本地磁盘空间 xff0c 免去输入地址以及账号 密码 方便我们日常中文件的上传和下载 1 双机桌面上的我的
  • Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解

    在电脑Bios设置中 xff0c 有一项 Secure Boot 相关设置 xff0c 很多朋友不知道Secure Boot什么意思 xff0c 也不知道该如何设置 下面本文就来谈谈Secure Boot设置相关的知识 xff0c 需要的朋
  • centos7 RAID磁盘阵列卡驱动安装图文教程

    解决方案 本方案可以支持centos7版本 UEFI模式 选择 Install CentOS Linux 7 xff0c 然后按 e 键 选择添加 linux dd xff0c 然后按 Ctrl 43 x 启动 进入如下图 虚拟光驱弹出系统

随机推荐

  • ubuntu 12.04 配置Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe无线网卡

    03 00 0 Network controller Ralink corp RT3290 Wireless 802 11n 1T 1R PCIe Subsystem Hewlett Packard Company Device 18ec
  • badblocks检查磁盘坏道

    参 数 功 能 s 显示检查进度 v 运行时显示详细的处理信息 w 做写入检测 root 64 localhost badblocks s dev sda2 Checking for bad blocks read only test do
  • 自协商(802.3)原理浅析

    题注 xff1a 在阅读过网上关于自协商的介绍文章 xff0c 在此针对阅读中遇到的疑问进行简单记录和分析 xff01 Q1 网络通信链路空闲时 xff0c 链路上固定发送检测脉冲的是TX 43 xff0c TX xff0c RX 43 x
  • ubuntu安装时姓名、计算机名、用户名的含义

    如有问题 xff0c 请加扣扣群 xff1a 460189483 ubuntu安装时 xff0c 最后一步是设置姓名 计算机名 用户名 xff0c 那么这些名字是什么意思 xff1f 之后又有什么作用呢 xff1f 下面来详解一下 安装最后
  • PB关于数据窗口内字段值改变问题

    1 在创建DW时 xff0c 如果使用select办法 xff0c 并且只查询一张表的话 xff0c PB默认自动提供修改其值 xff0c 程序运行后 xff0c 可以在DW控件内直接修改字段值 xff0c 当然如果要保存数据的话 xff0
  • 我的2016——培训、工作,回首大学

    我是一名计算机专业的本科生 xff0c 2016年7月到12月期间 xff0c 参加专业技能培训学习 在此期间接触一些其他高校的学生 xff0c 我和他们接触期间 xff0c 结合实际情况 xff0c 有以下感想 xff1a 1 在大学期间
  • ADSL Server出错解决一例(战神攻击)

    ADSL Server出现如下大量提示 var log messages Mar 19 16 36 43 ADSLserver kernel ll header ff ff ff ff ff ff 00 48 54 5b 0d 3f 08
  • uboot sf 命令用法

    转自 xff1a https blog csdn net kickxxx article details 56012456 uboot中如果支持spi qspi flash 那么可以使用sf的erase read write命令操作spi
  • 灰度共生(共现)矩阵的求法

    前段时间在写关于图像的作业时 xff0c 出现了灰度共生矩阵的求法问题 于是就上网查资料发现不是很理想 xff0c 翻书查阅也是不同的书籍出现的解法也是不一样 xff0c 上别的课时老师也给我们讲了下 xff0c 但是发现与我所看到的资料上
  • Qt调试问题记录(持续更新)

    目录 前言调试平台调试记录configure报C 43 43 11缺失g 43 43 编译选项不支持 前言 本人调试Qt所遇到的问题均会记录在此 xff0c 方便回溯 调试平台 Qt版本 xff1a 5 12 11Host PC xff1a
  • websocket autobahn jar包的用法

    autobahn 0 5 0 jar 文件的地址 xff1a http pan baidu com s 1slQYcKP 使用websocket好简单方便 xff0c 据一天来我们公司的大神说 xff1a websocket是封装好的成熟的
  • Linux中vnc的配置端口号的修改

    vnc的默认端口是自己配置的 xff0c 并不是这有一个端口号 通过打开 etc sysconfig vncservers 这里就配置了2个桌面 xff0c 一个桌面号是1 xff0c 一个是2 这里的配置的参数 VNCSERVERS 61
  • oracle的sql查询分析函数-高级部分-分析函授over()子句

    oracle的分析函数 xff0c 应该是有一个格式的 function argu1 argu2 over partition by order by windowing clause 这是一个完整的分析函数的格式 我之前用的分析函数 xf
  • 使用docker搭建鸿蒙开发环境

    第一步下载docker https docs docker com engine install windows 版本https desktop docker com win stable amd64 Docker 20Desktop 20
  • 数组

    一 数组中重复的数字 题目描述 xff1a 在一个长度为n的数组里的所有数字都在0到n 1的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字是重复的 也不知道每个数字重复几次 请找出数组中任意一个重复的数字 例如 xff0c
  • JSON序列化与反序列化

    一 需要序列化的POJO和初始化代码 以下3种类库的使用均使用下面这个POJO public class User public User private String id private String name private Stri
  • 排序

    一 数据流中的中位数 题目描述 xff1a 如何得到一个数据流中的中位数 xff1f 如果从数据流中读出奇数个数值 xff0c 那么中位数就是所有数值排序之后位于中间的数值 如果从数据流中读出偶数个数值 xff0c 那么中位数就是所有数值排
  • 常用的shell语句

    看文件里第几行 看倒数5行 tail n 5 SpecialVariable sh 看正数3行到最后一行 tail n 43 3 SpecialVariable sh 查看磁盘空间大小 df h 查看内存空间大小 top n 1 xff08
  • 【转载】SLAM技术 即将颠覆哪些领域

    什么是SLAM xff1f 机器人在未知环境中 xff0c 要实现智能化需要完成三个任务 xff0c 第一个是定位 xff08 Localization xff0c 第二个是建图 Mapping xff0c 第三个则是随后的路径规划 Nav
  • SIFT学习笔记(结合matlab源码)

    源码下载地址 xff1a https download csdn net download u014509577 11011793 一 算法流程 1 生成高斯金字塔 xff0c 并由此生成差分高斯金字塔 xff08 DoG xff09 xf