开源中国。
#@date: 2014-06-14
#@author: gerui
#@email: forgerui@gmail.com
sift(Scale-invariant feature transform)特征是局部不变化性特征,具有旋转不变性。计算sift特征主要步骤如下:
一、Contents
1. 构建尺度空间
尺度空间是模拟图像数据的多尺度特征。
L(x, y, σ) = G(x, y, σ) * I(x, y)
尺度空间一般取3~5层,2i-1(σ, kσ, k2,··· kσn-1), k = 21/s,其中s是每层塔包含的层数,i是第几层塔。
2. 用DOG近似LOG
对两个相信高斯尺度空间的图像相减,得到一个DoG的响应值图像D(x, y, σ)。使用DoG对LoG进行近似好处是:LoG需要使用两个方向的高斯二阶微分卷积核,DoG直接使用高斯卷积核,省去了对卷积核生成的计算量;DoG可以保留各个高斯尺度空间的图像;DoG是对LoG的近似,保留了LoG检测的优点。
3. 特征点查找
特征点即是局部的极值点,比较的区域是一个以查找点为中心的3*3的立方体,即这个中心点需要与26个点比较。搜索过程以每组的第二层开始。因为,这个查找是在离散的点上进行的,可以进行三维插值,从而可以找到准确的极值点。
4. 删除边缘效应
DoG对图像中的边缘有比较强的响应值,而一旦特征点落在边缘上,这些点就是不稳定的,因为边缘上的点很难定位,容易受到噪声的干扰。利用Hessian矩阵的特征值α,β判断是否舍去。
(α + β)/(αβ) > [(r+1)exp(2)]/r //如果大于则舍去,r取10
5. 特征点方向分配
以特点为中心,计算3*1.5σ
半径内的幅角和幅值。梯度方向直方图将360度分成36个柱,分个柱占10度。另外,每个加入梯度方向直方图的采样点都需进行高斯加权处理,通过高斯加权,离特征点较近的点有更大的权值。这样,直方图的峰值即是这个特征点邻域内梯度的主方向,也即为特征点的主方向。当还存在一个相当于主峰80%能量的峰值时,则认为该特征点为主方向的辅方向。
6. 特征点特征矢量生成
SIFT描述子h(x, y, θ)是对特征点附近邻域内高斯图像梯度统计结果的一种表示。为了保证特征矢量具有旋转不变性,需要以特征点为中心,旋转5中求出的主方向角θ。将该区域划分为44个子区域,每个子区域将360度划分为8个方向范围,每个范围为45度,计算8个方向的梯度强度信息。由于44的子区域和8个方向分量,所以共有448 = 128个数据,最终形成128维的SIFT特征矢量。
7. 进行匹配
通过将两幅图的描述子进行匹配,如果有两个描述子匹配成功,则说明两个其对应的两个特征点匹配上了。