已经有很多博客已经将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. IO流的登录与注册

    import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileR ...

  2. Arduino 1602液晶屏实验和程序

    在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrys ...

  3. vsftpd安装配置 530 Permission denied.错误

    yum install vsftpd service vsftpd start 530 Permission denied.错误 /etc/vsftpd/user_list    该文件里的用户账户在 ...

  4. HDOJ 2561. 第二小整数 第k大问题

    第二小整数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  5. [No00009C]Visual Studio在 解决方案资源管理器 里同步定位打开的文件

    标题的意思就是在使用VS的时候,需要我们打开编辑的文件跟解决方案的资源管理器同步显示,这样方便定位到我们在修改哪个文件. 设置如下: 工具——选项——项目和解决方案——在解决方案资源管理器中跟踪活动项 ...

  6. Lis日常维护

    1.[问题]护士站打印LIs条码,出来是PDF格式的 [解决]在文件夹Client\NeusoftLis\Xml\Print.xml中把BarcodePrint Name的值改成安装的斑马打印机名(不 ...

  7. [LeetCode] Validate IP Address 验证IP地址

    In this problem, your job to write a function to check whether a input string is a valid IPv4 addres ...

  8. [LeetCode] Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  9. [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  10. [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...