近期开始接触了一些SIFT的东西,这里记下对SIFT的一些理解,算是小结一下。
才疏学浅,刚刚接触,肯定有理解不对的地方,欢迎指正!
=====================================================================================
9.11更新
最近对SIFT有了新的理解
SIFT从更大的层面上来看就是分成两个部分:detector + descriptor
其中detector输入是一幅图像,输出是检测出的各个关键点
descriptor输入是关键点,输出是对关键点的描述
而detector和descriptor都是可以换掉的
就是说我可以用这里SIFT提出的detector方法,再用其他特征子的descriptor方法,
或者我可以用其他的特征子的detector方法,再用SIFT的descriptor方法,
当然也可以都换掉,当然也就不是SIFT了。。。
=====================================================================================
1.概括地说一下SIFT是个什么东西?
答:SIFT,全称:Scale Invariant Feature Transform,是一种特征提取的算法,提取出的特征是局部特征,具备很多优秀的性质,比如最突出的尺度不变性,还有旋转不变性,光照不变性等。该算法由UBC的David.G.Lowe于1999年首次提出,于2004年完善,且已申请专利。
经典文章:Distinctive Image Features from Scale-Invariant Keypoints. IJCV 2004
2.什么叫做尺度不变性?
答:首先,什么是尺度?尺度源自于图像的尺度空间理论,这种尺度空间模型是对人类生物视觉的一种模拟。在自然界中有各种各样的尺度,比如树的尺度是米级的,书本的尺度是厘米级的等等。你给了计算机一幅图片,计算机事先并不知道这张图片是以什么尺度来度量的,在这种情况下,提取的特征都是当前尺度下的,但计算机提取特征的时候并没有把尺度考虑在内,所以,那些提取的特征一般来说是不具备尺度不变性的,也就是说,一旦我观察的尺度有了变化,(想象一下,在用百度地图的时候,鼠标滑轮滚动,就是一种尺度的变化),那么这些特征点很可能就找不到了,既然都找不到了,那怎么进一步匹配或者做什么呢?所以这些特征点在尺度的变化下就是不稳定的,但SIFT提取的特征就是对尺度变化比较稳定,所以SIFT才强大嘛!
3.什么叫做旋转不变性?
答:首先,我们要知道,提取特征点之后,我们是要用这些特征点做一些有用的事情,比如匹配查找图片,一旦两幅本质上是一样的图片,其中一幅图片旋转了某一个角度,那我还能匹配吗?当然是没问题的,这就看你提取的特征点是否具有旋转不变性了,也就是说,即使旋转了一定角度,我还是能够找到这样的特征点,和原来的特征点一一对应起来,一般来说旋转不变性是诸多特征提取算法基本都具备的性质。
4.感觉还是很抽象的样子,SIFT提取出来的特征点究竟是个什么啊?什么形式的特征点啊?
答:是向量,一个128维的向量(L1, L2, L3, ..., L128),整个SIFT就是为了构造这么一个向量,向量的每一维都体现了一定的特征点或其周围的信息,128个信息就比较靠谱地把某个点(特征点)周围的情况啊什么的都表达清楚了,也比较独特,基本不会找到很相似的实质上不是一个地方的点。
5.好吧,SIFT确实比较不错的样子,那我要怎么做呢?
答:经典步骤这里就不细说了,那四个步骤已经有网友说的很详细了,可以参考:
http://blog.youkuaiyun.com/zddblog/article/details/7521424
http://blog.youkuaiyun.com/abcjennifer/article/details/7639681
http://blog.youkuaiyun.com/xiaowei_cqu/article/details/8069548
6.那我再问你几个问题。一个是SIFT里面的尺度空间究竟是什么啊?
答:作者直接给出了定义:L(x,y,sigma)=G(x, y, sigma) * I (x, y),这里的L就是尺度空间了。其中,sigma请自行脑补。。。G是高斯函数,I是原始图像
7.为什么卷积的时候只需要在(6σ+1)*(6σ+1)的范围内就行了呢?
答:概率论的3σ法则,详细可以参见正态分布那一块。也就是说在原点左右3σ的范围内,落在这里的概率就已经非常高了,达到了99.7%,所以吧范围之外的都舍掉也问题不大。
8.为什么是高斯函数呢?其它函数不行吗?
答:Lindeberg等人已经证明,只能用高斯函数。当然博主没看过证明。
9.为什么使用DOG算子而不是LOG算子?
答:1.DOG效率高:当我已经构造玩高斯金字塔之后,如果我还要使用LOG算子,那我还要计算LOG的卷积模板,然后再对图像做卷积,还要做很多次乘法,但如果这时候我使用DOG算子,我只需要对已经构造完的高斯金字塔两两做差就行了,只是一些加减法,计算量小很多;
2.DOG和LOG比较近似:具体的公式可以见论文或者上面列出的参考资料。
10.去除那两类点的原理是什么?例如为什么那个D(X)就可以判别对比度高低,Hessian矩阵什么的都是些什么。。。?
答:博主也不知道背后的原理,只知道是这么做的。
11.统计直方图的时候是怎么统计的啊?
答:这里的直方图实质上是一种对角度的直方图,每10°做一个划分,成为一个Bin,360°一共就有36个bin。在统计的时候,先计算出每个点的梯度幅度m(x,y)和角度theta(x,y),具体公式见论文或上方的参考资料,之后对于每一个点,先计算他是位于哪一个Bin(根据其角度),在把这个幅度累加到这个bin里面,实际操作的时候还考虑到了权值,权值和该点到特征点的距离成反比。
12.旋转不变性是怎么得到的?
答:主方向是实现旋转不变性的途径。在计算出主方向之后,我遇到一个想要匹配的物体,就先计算它的主方向,看看他和我之前得到主方向的夹角,可以通过旋转公式把像素点都旋转过去,这样旋转操作就对图片匹配没有影响了。
13.亚像素sub pixel是怎么回事?
答:亚像素就是硬件上没有实现,但是软件上认可其存在的一个东西,利用其来计算一些东西,实质上可以当做是一种数量级,也就是比原来的像素在低一级(更细一级)的精度。
14.归一化是怎么消除光照,对比度的影响的?
答:这是论文里的话。归一化之后,如果是对比度的变化,那么分子分母都可以约掉这么一个常数,所以没有影响;
如果是光照的变化,也就是统一加一个常数,因为我们做的是差分高斯金字塔,是做差得到的,所以光照应该也没有影响。
具体的OpenCV源代码里面的问题,之后有空再整理。
这里只列出第一个:
15.请问OpenCVS的SIFT源码在哪里。。。。?
答:好吧,这是我确实遇到的问题。源码在...(你的安装路径)\opencv\sources\modules\nonfree\src,里面有SIFT,SURF等的源码。