已经有很多博客已经将sift特征提取算法解释的很清楚了,我只是记录一些我不明白的地方,并且记录几个理解sift特征比较好的博客。

1. http://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/

2. http://blog.csdn.net/abcjennifer/article/details/7639681/

3.http://blog.csdn.net/xiaowei_cqu/article/details/8067881

4.https://en.wikipedia.org/wiki/Scale_space

5.http://blog.csdn.net/pi9nc/article/details/23302075

一、说到sift特征就不得不提什么是尺度空间(scale-space)

一个感观的认识就是人眼在看一个物体的时候远和近时,物体在视网膜上成像。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。在图像形成的过程中不可避免的会有将摄像头拉近或者拉远的操作,而这种操作带来的就是尺度的变化,这也是想寻找尺度不变特征的原因。

一个理论上的解释参考WIKI:The main type of scale space is the linear (Gaussian) scale space:

就是说尺度空间就是用不同参数t的高斯核去卷积图像得到的。我们可以从参考材料的1和4中可以看到模糊的例子,上面的t是方差,也就是下文将要说的sigma的平方。

二、尺度不变性

参考这个网址:http://dsp.stackexchange.com/questions/397/why-is-the-difference-of-gaussians-scale-space-scale-invariant?rq=1,对尺度不变性给出了一个简单的回答:

The term "scale-invariant" means the following here. Let's say you have image I, and you have detected a feature (aka an interest point) f at some location (x,y) and at some scale level s. Now let's say you have an image I', which is a scaled version of I (downsampled, for instance). Then, if your feature detector is scale-invariant, you should be able to detect the corresponding feature f' in I' at the corresponding location (x',y') and corresponding scale s', where (x, y, s) and (x', y', s')are related by the appropriate scaling transformation.

我的理解就是说如果你的图片I在尺度s下被检测出在(x,y)下具有特征点f,那么如果你有另一张在其他尺度s'下的图片I',如果你的特征检测器是尺度不变的话,你应该可以检测出对应的特征点f',位置于(x',y')使得(x,y,s)与(x',y',s')只差一个放缩变换。下面有一个我自己的理解,不一定正确,有时间我在看看尺度理论。假设在sigma尺度下找到的特征点为(x,y,sigma)则有下面这个等式成立,这里的sigma是方差:

如果另一张图片在另外一个尺度下,也就是将图片I进行模糊后,在求极值寻找特征点会有以下的式子(误,只是一种数学上的感觉):

(这里的t和一中的t不是同一个)我们用G(x,y,t)对图片I进行模糊得到另外一个尺度的图片,然后我们再用DOG对其进行卷积并在尺度sigma下求极值。根据卷积的结合律(可以参考WIKI:https://en.wikipedia.org/wiki/Convolution)就有上式第二行的结果,然后根据卷积的交换律有第三行的结果,然后t和sigma是独立的或者说t是常量所以从求导符号中提出来,然后根据上上式就会发现上上式求得的极值点也是另一个尺度图片下求得的极值点。用一篇论文的一个图片例子:

上图就发现在相对应的特征点是不同scale上的极值点。

三、为什么要用GOG(difference of Gaussian)去替换LOG(Laplancian of Gaussian)

根据这篇文章:http://www.scholarpedia.org/article/Scale_Invariant_Feature_Transform

也就是说Lindeberg在他的两篇关于blob detection论文中发现blob可以通过scale-normalized Laplacian检测出来,那么什么是尺度归一化的拉普拉斯呢?文章又给出了定义,就是上图的第一个公式(s是方差,也就是sigma的平方)。然后在sift中为什么不用尺度归一化的拉普拉斯变换来计算尺度不变的特征点呢?原因是他又发现DOG是LOG的一个近似,而且据说计算速度更快。是怎么证明DOG是LOG的近似呢?这里我来证明一下。这里有几个定义混淆了,我们先区分一下:

1. 拉普拉斯变换,对函数f(x,y)进行拉普拉斯变换就是求二阶偏导数相加:

2. Laplacian of Gaussian (LOG)

3. 尺度不变的拉普拉斯变换,根据上面文章第一个公式,由于卷积与导数的运算法则,可以知道尺度不变的拉普拉斯变换是:

4. Difference of Gaussian (DOG)

5. 二维的高斯分布,均值为0,方差为sigma平方

6. 证明DOG是LOG的一个近似,首先我们证明下面这个式子成立:

非常简单,只要你知道如何求高斯函数的导数就好了,等式右边的求导过程可以参考网址:http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html, 在这里我给一个简单的证明。

因此等式右边等于:

等式左边对sigma进行求导,求导过程非常简单,我就不打算记录很详细了:

因此我们左边等于右边,只需稍微化简一下。因此有下面这个成立:

因此DOG和尺度归一化的LOG只差一个常数因子(k-1)并不影响极值点位置的求取,见博客(blog.csdn.net/pi9nc/article/details/23302075)。整个近似就证明完毕(*)。

  上面只是说了一些我对尺度空间明白的地方,当然还有很多不明白的地方等我以后看懂了再回头记下,又回到sift特征,还有几个主题想记录一下。

四、我们在每座高斯金字塔中额外的新增了3层,为什么能够满足尺度变化的连续性。我觉得参考文章2中已经解释的很清楚,我直接转和复制一下,并且附上我自己手绘的一幅图便于理解:

暂时明白了这么多,以后再加,剩下的理解在源码中注释了,见另外的一篇博客

sift特征的更多相关文章

  1. SIFT特征详解

    1.SIFT概述 SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的.SIFT特征对旋转.尺度缩放.亮度变 ...

  2. opencv获取图片sift特征

    利用opencv2.3来获取图片的sift特征,并输出到标准输出,可用重定向到文件. #include<cstdio> #include"opencv2/opencv.hpp&q ...

  3. opencv java api提取图片sift特征

    opencv在2.4.4版本以后添加了对java的最新支持,可以利用java api了.下面就是我利用opencv的java api 提取图片的sift特征. import org.opencv.co ...

  4. [Computer Vision] SIFT特征学习笔记

    SIFT(Scale Invariant Feature Transform),尺度空间不变特征,目前手工设计的最好vision特征. 以下是学习http://blog.csdn.net/zddblo ...

  5. SIFT特征点检测学习一(转载)

    新手上路,先转载学习tornadomeet的博客:http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html 特征点检测学习_ ...

  6. 基于SIFT特征的全景图像拼接

    基于SIFT特征的全景图像拼接 分类: image Machine learning2013-07-05 13:33 2554人阅读 评论(3) 收藏 举报 基于SIFT特征的全景图像拼接 分类: 计 ...

  7. 机器学习进阶-案例实战-图像全景拼接-书籍SIFT特征点连接 1.cv2.drawMatches(对两个图像的关键点进行连线操作)

    1.cv2.drawMatches(imageA, kpsA, imageB, kpsB, matches[:10], None, flags=2)  # 对两个图像关键点进行连线操作 参数说明:im ...

  8. OpenCV教程(47) sift特征和surf特征

         在前面三篇教程中的几种角检测方法,比如harris角检测,都是旋转无关的,即使我们转动图像,依然能检测出角的位置,但是图像缩放后,harris角检测可能会失效,比如下面的图像,图像放大之前可 ...

  9. 使用sift特征点进行knn最近邻匹配

    #include <opencv2/xfeatures2d/nonfree.hpp> #include <opencv2/features2d/features2d.hpp> ...

随机推荐

  1. Android中的自定义控件(一)

    自定义控件是根据自己的需要自己来编写控件.安卓自带的控件有时候无法满足你的需求,这种时候,我们只能去自己去实现适合项目的控件.同时,安卓也允许你去继承已经存在的控件或者实现你自己的控件以便优化界面和创 ...

  2. xUtils 3.0 post使用详解

    github:https://github.com/wyouflf/xUtils3 xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传, ...

  3. SVN使用_获取某版本后改动的文件列表

    本章将讲解如何通过svn命令获取某版本后改动的所有文件 一键操作,告别svn log的繁杂对比工作. 1:安装SVN命令行工具Subversion(不是TortoiseSVN) 下载Subversio ...

  4. IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈

    以前写过一个文(IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章),主要介绍笔者的职业发展之路,不过该文需要后续了,因为笔者现在从事的是“产品经理”一职.从笔者的导航文([置顶]博文快 ...

  5. Centos 安装配置gerrit

    关闭selinux,不然nginx的反向代理会报错connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting ...

  6. Reactor 模式的简单实现

    Reactor 模式简单实现 在网上有部分文章在描述Netty时,会提到Reactor.这个Reactor到底是什么呢?为了搞清楚Reactor到底是什么鬼,我写了一个简单的Demo,来帮助大家理解他 ...

  7. Kubernets搭建Kubernetes-dashboard

    接上篇文章,在已经部署好Kubernetes的基础上部署kubernetes-dashboard,它是官方提供的用户管理Kubernets集群可视化工具:部署dashboard其实和在kubernet ...

  8. 为 suse linux 设置程序自动启动

    1.suse linux 程序自动启动 在部署面安装的的时候,重启之后需要去tomcat/bin/startup.sh 下面去执行启动脚本. 设置开机自动启动该服务    在 vim   /etc/i ...

  9. 8.dns服务的搭建

    一.DNS的相关配置文件 /etc/hosts    本地主机列表 /etc/nssswitch.conf     本地主机查询方式 /etc/host.conf /etc/resolv.conf   ...

  10. shell两数之间的算术运算

    #!/bin/bash read -p "请输入第一个数:" a read -p "请输入第二个数:" b echo "$a+$b=$[$a+$b]& ...