sift计算描述子代码详解_浅谈SIFT特征描述子
SIFT是我接触最早的图像局部特征描述子之一,其实最初,始终觉得局部特征描述子是些非常玄虚的东西。对于SIFT,这种感觉更是尤为强烈,“尺度空间”“拉普拉斯高斯算子(LoG)”“高斯差分金字塔”,一系列让人头痛的概念。不过,反反复复看了几次,渐渐也就有了感觉,在此总结一下。
物体识别的核心问题是将同一目标在不同时间、不同分辨率、不同光照、不同位姿情况下所成的像相相匹配。而为了进行匹配,我们首先要合理的表示图像。由于目标的自身状态、场景所处的环境的影响,同一类物体在不同的图像中所成的像往往会差别很大,但即使这样,人们所能通过同一物体的一些局部共性来识别出物体(正如我们能将不同国家民族的人区分出来)。所谓局部特征描述子就是用来刻画图像中的这些局部共性的,而我们也可以将一幅图像映射(变换)为一个局部特征的集合。理想的局部特征应具有平移、缩放、旋转不变性,同时对光照变化、仿射及投影影响也应有很好的鲁棒性。传统的局部特征往往是直接提取角点或边缘,对环境的适应能力较差。1999年British
Columbia大学David
G.Lowe 教授总结了现有的基于不变量技术的特征检测方法,并正式提出了一种基于尺度空间的、对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子-SIFT(尺度不变特征变换),这种算法在2004年被加以完善。
SIFT算法的实质可以归为在不同尺度空间上查找关键点(特征点)的问题。所谓关键点,就是一些十分突出的点,这些点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相同的景物,
那么使用某种方法分别提取各自的稳定点,这些点之间就会有相互对应的匹配点。而在SIFT中,关键点是在不同尺度空间的图像下检测出的具有方向信息的局部极值点。涉及到的最重要的两步是:1.构建尺度空间
2.关键点检测
构建尺度空间
先来谈谈尺度的问题。我们要精确表示的物体都是通过一定的尺度来反映的。现实世界的物体也总是通过不同尺度的观察而得到不同的变化。比如说,对同一物体拍照,我们拍摄了一副近景,一副远景,虽然两幅图片中都有这个物体,但这个物体确是处于两个不同的尺度。SIFT特征具有尺度不变性,就是说即使同一物体处于两个不同的尺度的图像中,我们仍可以通过提取图像的SIFT特征匹配成功。
图像的尺度有多种表示方法(金字塔、八叉树等等),在SIFT中Lowe教授采用了尺度空间理论。其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,并检测这个序列中的关键点。这样图片就被映射为多个尺度上的关键点信息,尽管两幅图片是处于不同的尺度,但却可以提取出在尺度变换中没有改变的关键点,从而进行关键点匹配,进而识别出物体。
实际上,在尺度空间理论中,是通过对图像进行模糊来模拟多尺度下的图像。直观上,图像的模糊程度逐渐变大,模拟了人在距离目标由近到远时目标在视网膜上的形成过程。文献《Scale-space
theory: A basic tool for analysing structures at different
scales》证明,高斯核是唯一可以产生多尺度空间的核(其它核会对图像造成模糊之外的其它影响)。一个图像的尺度空间, \(L(x,y,\sigma)\) (\(\sigma\) 可以代表尺度的大小)
,定义为原始图像 \(I(x,y)\) 与一个可变尺度的2维高斯函数 \(G(x,y,\sigma)\) 卷积运算。高斯函数:
\[G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}e^{-(x^2+y^2)/(2\sigma^2)}\]
\[L(x,y,\sigma)=G(x,y,\sigma)*I(x,y)\]
需要的注意的是,图像的尺度是自然存在的,不是人为创造的!高斯卷积只是表现尺度空间的一种形式。(在SIFT的代码中,进行高斯模糊时,用到了高斯模糊的“勾股定理”:例如,使用半径分别为
6 和 8 的两次高斯模糊变换得到的效果等同于一次半径为 10 的高斯模糊效果)。
图1:高斯金字塔
在SIFT中,构建了高斯金字塔(如图1所示),即分为两步:1)对图像做高斯平滑
2)对图像做降采样(减小计算量)。一幅图像可以产生几组(octave)图像,一组图像包括几层(interval)图像。为了让尺度体现出连续性,相邻两层图像间的尺度为k倍的关系,同时相邻两组的同一层尺度为2倍的关系(在SIFT算法中,Lowe教授假设初始图片已经是以一定 \(\sigma\)模糊过得了)。
关键点检测
文献《Scale-space
theory: A basic tool for analysing structures at different
scales》指出尺度规范化的LoG算子具有真正的尺度不变性。即我们可以在不同尺度的图像(已经经过高斯卷积)上进行拉普拉斯运算(二阶导数),并求极值点,从而求出关键点。但这样做的运算量很大,于是SIFT中进行了近似处理:
\[\nabla
^2G = \frac{{{\partial ^2}G}}{{\partial {x^2}}} + \frac{{{\partial
^2}G}}{{\partial {y^2}}}\]
\[LOG(x,y,\sigma
) = {\sigma ^2}{\nabla ^2}G \approx \frac{{Gauss(x,y,k\sigma ) -
Gauss(x,y,\sigma )}}{{{\sigma ^2}(k - 1)}}\]
\[G\left(
{x,y,k\sigma } \right) - G\left( {x,y,\sigma } \right) \approx
\left( {k - 1} \right){\sigma ^2}{\nabla ^2}G\]
通过推导可以看出,LoG算子与高斯核函数的差有直接关系,由此引入一种新的算子DoG(Difference
of Gaussians),即高斯差分算子:
\[D\left(
{x,y,\sigma } \right) = \left[ {G\left( {x,y,k\sigma } \right) -
G\left( {x,y,\sigma } \right)} \right]*I\left( {x,y} \right) =
L\left( {x,y,k\sigma } \right) - L\left( {x,y,\sigma } \right)
\]
可以看出,LoG算子和DoG算子指相差常数系数,而这并不会改变极值点的位置。因此我们在DoG算子中求得极值点就是LoG算子的极值点,也正是我们需要的关键点。而DoG在计算上只需相邻尺度高斯平滑后图像相减,因此简化了计算!
对应DOG算子,我们要构建DOG金字塔
图2:高斯差分金字塔
如下图,我们可以通过高斯差分图像看出图像上的像素值变化情况。如果没有变化,也就没有特征。特征必须是变化尽可能多的点。本质上,DOG图像描绘的是目标的轮廓。
图3:高斯差分处理后的图像
关键点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。具体来说,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
至此就可以检测出图像中尺度不变的关键点,然后我们为关键点赋予梯度方向,并利用关键点的周围的像素梯度方向直方图生成SIFT特征描述子。具体过程可以参考以下资料(想整理的问题总结完了,偷个懒,>_
sift计算描述子代码详解_浅谈SIFT特征描述子相关推荐
- sift计算描述子代码详解_代码详解——如何计算横向误差?
在路径跟踪控制的论文中,我们常会看到判断精确性的指标,即横向误差和航向误差,那么横向误差和航向误差如何获得? 在前几期代码详解中,参考路径和实际轨迹均由To Workspace模块导出,如图所示: 那 ...
- vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者
废话少说,代码如下所述: /p> 显示123 /p> 补充:vuejs {{}},v-text 和 v-html的区别 {{message}} let app = new Vue({ el ...
- sift计算描述子代码详解_SIFT解析(三)生成特征描述子
以上两篇中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征.下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点. 下面好好说说如何来描述这些特征 ...
- zuc算法代码详解_最短路算法-dijkstra代码与案例详解
引言 在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点: 一.算法的选择和程序的编写.最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的 ...
- yolov3代码详解_代码资料
faster RCNN TensorFlow版本: 龙鹏:[技术综述]万字长文详解Faster RCNN源代码(一) buptscdc:tensorflow 版faster rcnn代码理解(1) l ...
- ucos 消息队列代码详解_用python实现 多进程队的列数据处理详解,零基础记得都收藏哦
今天就为大家分享一篇python 多进程队列数据处理详解,具有很好的参考价值,希望对大家有所帮助.喜欢的话记得点赞转发关注不迷路哦!!! 总之了写到多进程队列数据处理问题,也就不多废话了,直接来上代码 ...
- 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法
你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发 ...
- MySQL子查询的优缺点_浅谈mysql的子查询
浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...
- 【C语言】初始C语言系列 代码详解 _ 编程入门 _【内附代码和图片】_ [初阶篇 _ 总结复习]
[前言] 本篇文章为初始C语言部分,C语言是编程的入门语言,所以也说是编程入门: 学好C语言的入门内容,才能真正的入门编程,而C语言的学习对于刚入门的同学还是有一些难度的,需要踏踏实实的自己去理解. ...
最新文章
- 织梦 PHP 字段 调用,织梦dede网站内容模型普通文章调用自定义图片字段的方法(和调用...
- python上海培训哪里比较好-上海十大python培训机构排名
- 进击的Android Hook 注入术《五》
- 【简便解法】1089 狼人杀-简单版 (20分)_25行代码AC
- Designing Virtual Connect for vSphere 5.x
- 洛谷 P4392 Sound 静音问题
- 基于深度学习生成音乐(mid格式的音乐) 附代码,自己调试过,python3的
- 景嘉微变更会计师事务所引发投资者担忧
- 服务器ip总是被封,怎么办?
- 360无线网卡驱动linux,ubuntu安装360随身wifi驱动
- 买苹果配件什么最靠谱 认识苹果MFi认证
- UA MATH563 概率论的数学基础1 概率空间4 实数域上的概率测度
- Arduino IDE+_Attiny13/85实践(一) IED环境配置
- 【Pytorch】tensor类型数据.squeeze()和.unsqueeze()函数的简明教程(一看就会)
- 我被Algo套死了......
- 造病毒攻陷三亿网民,中国黑客十八年做了些什么?
- 网上特工网络监控系统 v5.65 官网
- 添加数据时候获取自增的ID
- 从金鸡百花电影节,看“鼓浪屿元宇宙”的元力、魅力与想象力
- html搜索框判断跳转,搜索关键字:ajax实现;点击搜索到的会添加到搜索框内,点击搜索跳转页面;...