本文主要是介绍SIFT特征检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作为在CV界叱咤风云多年的SIFT,David Lowe1999年提出来,2005年完善发表在IJCV上。至今已经作为一道丰碑屹立CV界十年不倒,不可谓不震古烁今。作为最经典的高效斑点检测算子之一,对于学习局部特征的我来说,研读必要性不言而喻。这篇文章,将主要介绍SIFT特征提取的过程,当然网上已经有了各种介绍SIFT的博文,其中很多准确的分析给了我很大的指导。太多就不一一列举,不过推荐大家关注一下http://blog.csdn.net/abcjennifer/article/details/7639681这篇博文的作者,确实是大神啊,CV,机器学习等各种涉猎甚至精通,确实给我这种小白很大的启发。闲话就讲这些,下面开始正题,本文不是完整介绍SIFT特征检测,主要是分析一下我在研读SIFT时遇到的问题,以及一些想法。完整介绍网上已经有太多,大家可以自己搜索。
SIFT原文:http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf
SIFT的创新点:
- 首先我们得知道,SIFT是一种局部特征解决方案。虽然我们总在说SIFT,但是你得意识到SIFT是一种将特征点检测,特征点描述,特征点匹配,经过程序优化,FPGA加速等手段,可以达到实时运行的解决方案。
- 然后,SIFT是一种斑点检测的算子(具体什么是斑点,参看http://blog.csdn.net/u013207865/article/details/48542539)。斑点检测比较早期且经典的就是LOG和DOH,其实LOG和DOH的原理是很相似的,都是基于高斯函数的二阶微分,区别在于响应函数,LOG的响应函数是规范化的拉普拉斯响应,DOH的响应函数是图像的二阶微分矩阵。所以LOG和DOH,都涉及到卷积核在两个方向的一阶和二阶微分,比较费时。SIFT提出了对LOG的近似算法,DOG。
DOG原理:
尺度空间(http://blog.csdn.net/u013207865/article/details/48518637这篇文章有介绍,尺度空间表达式利用的是原始图像与高斯核函数卷积得到)。LOG利用的是规范化的拉普拉斯函数,表达式是
但是参考热传导方程:
故可以得到下式:
也就是拉普拉斯表达式变为了核函数关于尺度的导数,而核函数关于尺度导数可以利用有限差分:
进而可得:
上式左边就是DOG的基本公式,右边就是LOG的基本公式,这样就完成了DOG对LOG的近似。
利用DOG对LOG进行近似,主要优势:
- 计算量小,毕竟DOG直接利用高斯卷积核,不需要像LOG在两个方向进行高斯二阶微分卷积核计算
- DOG保留了各个高斯尺度空间的图像(图像金字塔),这样为后续描述向量的生成提供了数据
- DOG是LOG的近似,所以继承了LOG的优点,抗噪能力强,稳定性好。
高斯差分金字塔的生成:
这个是SIFT比较经典的,虽然高斯金字塔很早就有,但是SIFT对其的运用确实精彩。SIFT是基于高斯金字塔,生成差分金字塔。生成步骤如下:
高斯金字塔有两个概念,组(octave,后面简称o)和层(level,后面简称s)。David Lowe论文中,给出的是o=3,s=3。
这里需要说明,s=3不是说,在建立高斯金字塔的时候每组只有3层,一般建立高斯金字塔时,每组有s+3层,进而生成的差分金字塔有s+2层,然后特征检测需要剔除上下最外面两层,就只剩下s层了,这个概念是我以前总是迷糊的。第二个就是o的第一组设置,分为0和-1两种。当为0时,正如上图所示,输入的就是原图,输入原图时需要进行 σn=0.5 的高斯模糊,然后再以此为基础进行高斯金字塔的建立;当为-1时,对原图像先进行一个双线性插值放大一倍,然后再进行 σn=1 的高斯模糊,紧接着进行高斯金字塔的建立。总结一下:两者的区别在于,是否对原图像进行放大。
σ0 称之为基准层的尺度,然后每组每层的尺度计算,利用的是下式
其中 omin=−1 、 s∈{0,...,S+1} 图中有误。每组的第一张图片是上一组的倒数第三章图片降采样得到的,这样做的目的是为了保证尺度空间的连续性。什么叫尺度空间的连续性?比如 {σ,kσ,k2σ.....knσ} 这样的尺度空间就是连续的,如果尺度空间是 {σ,kσ,kσ.....kmσ} ,那么就是不连续的。具体可以参看下面这张图,就知道为什么需要选取倒数第三张图进行降采样了。
红色框中就是最终建立的差分尺度空间,可以发现从左到右,其尺度是连续的。
点的搜索、定位以及删除边缘效应
这个其实认真看一下,很好理解,也就没什么需要特别说明的了。简单说一下:很显然,我们得到的特征点坐标是像素级别的,但是在一些更加精密的实验中,像素级别的特征点是不能满足要求的,因而需要对特征点进行精确定位到亚像素级别,这就是特征点定位完成的任务。
删除边缘效应,可以参考Harris角点检测(http://blog.csdn.net/u013207865/article/details/48572957)。这里主要是设置两个特征值的比值 λ>1 , λ 也叫主曲率比值David Lowe设置的是10.
PS :给大家推荐一个很强大,简单的库,VLFeat,里面有CV和ML的各种基本算法的实现。
这篇关于SIFT特征检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!