SIFT(尺度不变特征变换)

SIFT(尺度不变特征变换)

基本上参考http://blog.csdn.net/abcjennifer/article/details/7639681这篇文献,不过个人感觉作者写的思路不够清晰,虽然我写的也不咋的;

文章只是个人理解,有错误请指正。

用途和特点:描述图像中的局部特征,一种可以检测并计算出对于在光照、图像噪点、旋转、缩放和视点变换时提取出不变的局部特征值的算法。具体的原理着实复杂,从昨天看到今天迷迷糊糊懂了点。不管是构建尺度空间,还是运用LOG,DOG,都是为了实现提取到的特征点能够在关照和旋转,缩放等情况下保持不变。

要怎么实现,这就涉及到整体与局部的问题了,一副图像有精细复杂的部分,也有粗枝大叶的部分,这体现在图像局部直方图分布上,所以无法用整体的统计模型来对图像分析,要想提取图像的不变特征,必须在多个尺度上进行,也就是说不管在哪个尺度我这个特征都是存在的,跟尺度的大小是没有关系的

一,建立好尺度的空间

要对每个尺度进行分析,首先就要建立好尺度的空间,怎么建立,最基本就是对原图像进行降采样,一般是以2的幂次进行采样的,每采样一次得到图像就是一个尺度空间,相当于金字塔的一层采样得到一系列的图像就是一个金字塔。而在采样之前一般会通过一个低通滤波器(抗混叠),如果采用的是高斯低通,得到的就是高斯金字塔。而在SIFT中,采用的高斯低通其方差是可以变化的,在每次采样前都通过不同的方差对图像进行一系列的滤波,这一系列的滤波构成塔的每个层中尺度(每个方差一个尺度)相当于层中的一楼,那么层中方差和层与层之间方差有什么关系呢。层中方差满足σ, k*σ, k*k*σ的关系,层间方差σ, 1*σ, 2*σ,比如第一层是σ, k*σ, k*k*σ,第二层就为2*σ,2* k*σ, 2*k*k*σ。但是这一处理还没结束,上面处理得到是高斯尺度空间,只有把层中的每两楼还要进行相减才能得到最后的DOG尺度空间。

 

 

 

 

 

 

 

利用数学公式对其进行分析,于是一副二维图像的尺度空间定义为:

其中 G(x,y,σ) 是尺度可变高斯函数。(x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率) σ方差(代表数据间的差异程度)越大,高斯函数的开口越大,包含更多图像中像素,说明越不精细反之,方差小,对应开口小,像素仅跟自己周边的有关。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

 

什么是尺度可变高斯函数http://www.cnblogs.com/ttthink/articles/1577789.html

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

图像金字塔:http://www.cnblogs.com/zsb517/archive/2012/06/10/2543739.html

二,找到 DOG尺度空间特征点

一般来说,尺度空间的极值点能够作为其特征点,为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。


同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找


s=3的情况

 在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了 3 幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

关于特征点的选择详细见:http://blog.csdn.net/jwh_bupt/article/details/7621681

这一部分都转载,地址上有更详细描述:http://blog.csdn.net/abcjennifer/article/details/7639681#comments

三,除去不好的特征点

四,对特征点进行描述

经过之前的一系列处理,得到的是一个个特征点,那怎么在原图上描述这一系列的特征点呢?首先坐标比不可少的(即位置),第二是在哪个尺度得到的特征,尺度也是需要的,第三为了实现旋转不变,还必须定义关键点的方向。关键点的方向又该怎么定义呢?

为了体现局部性和旋转不变,一般是由关键点的领域像素的梯度方向来确定关键点的方向。

具体步骤为

(1)根据下述公式计算每一尺度关键点领域像素的梯度方向

 

其中L所用的尺度为每个关键点各自所在的尺度。

(2)统计领域像素的梯度方向

我们知道梯度的范围是0~360度,那么可以对领域内的梯度方向进行统计,比如设置36个集合,方向为0-10度的一个集合,10-20度一个集合,以此类推,或者均分为8个集合,每45度一个集合,利用类似像素直方图的方式进行描述,每个直方图代表一个集合,对梯度方向落在集合中的像素进行统计,如下图,其中直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向其他的达到最大值80%的方向可作为辅助方向


至此我们得到了关键点的方向。

五, 关键点描述子的生成

但是采用位置,尺度和方向的描述不足以实现两幅图的匹配,同时为进一步实现旋转不变以及关照等的影响,实际中还采用了128维的向量对特征点进行描述,在匹配的时候就仅比较两幅图的128维向量就可以了。那如何得到这一向量呢?

首先对关键点8*8的领域进行分析,利用第四步的步骤(1)得到关键点的方向和领域像素梯度后,如下图,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算。以关键点为中心取8×8的窗口。利用第四步的步骤(2)在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。

  

将上图的区域扩展到16*16就得到最后我们要的128维向量了,在关键点周围取16*16个领域像素,依照步骤四的(1)计算梯度的模和方向,同样用高斯窗口对其进行加权运算。将这16*16的区域分成16个4*4的区域,对每一个4*4的区域利用步骤四的(2)方法来统计梯度方向和模,即将梯度方向(0-360度)分成八个集合,落在一个集合中的向量模进行相加,最后每个集合用一个有大小,方向的向量表示,实际则采用直方图。这样就16*8=128维的向量来描述一个关键点了,如下图,对将这个向量归一化之后,就进一步去除了光照的影响。


更新:放两张图助于理解

第一张是图像的关键点的特征,采用的是一个个圆来描述,直径代表尺寸,一条半径是方向,圆中心是位置。


第二张是上图特征的128个描述子,取16*16方格,计算梯度,统计,从图中看出各个尺度的方格大小是不一样的。


六, 根据SIFT进行Match


参考 http://blog.csdn.net/abcjennifer/article/details/7639681
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值