sift计算描述子代码详解_SIFT算法之章节二——特征描述子

特征描述子

在特征点提取之后,我们需要选择一种合适的特征描述方法来描述特征点附近局部图像模式。为了实现两幅图像之间的相似性度量,使用或选择一种紧凑而完整的特征描述是十分重要的。

1、特征描述子简介

1)特征描述子(Descriptor)是一种图像局部结构特征的定量化数据描述,可以充分反映特征点附近局部图像的形状和纹理结构信息。

2)特征描述子不变性和信息内容(描述子所能承载的信息量,由特征点检测和描述字长度共同决定)两个重要的性质,决定了描述子的鲁棒性(Robustness)和独特性(Distinctiveness),这两个性质既相互矛盾又相互依存。

3)理想的特征描述子应该具备较高的鲁棒性(能在图像仿射变换、密度变化和噪声干扰下稳定工作)、独特性(特征点局部图像发生变化时稳定工作)和匹配速度(相似性比较时的运算速度,特征空间维数越高,匹配速度越慢)

4)迄今为止,特征描述子大致可分为:基于图像梯度分布(主要使用梯度统计直方图来表示不同图像的局部纹理特征和形状特征)、基于空间频率、基于微分、不变矩等类型。具体主要有:SIFT(很多描述子是在此方法上改进的)、SURF、GLOH、PCA-SIFT、旋转图像、形状上下文、可控滤波器、微分不变性、复数滤波器、矩形不变性等。

2、特征点方向分配

因为特征比较时必须具有旋转不变性,所以我们需要根据检测到的特征点的局部图像求得一个方向基准。

1)方向分配基本思想

使用图像梯度的方法求取该局部结构的稳定方向。

2)方向分配步骤

第一步:得到该特征点的尺度值σ,根据这一尺度值,得到最接近这一尺度的高斯图像:

第二步:根据有限差分,计算以特征点为中心,以3×1.5σ为半径的区域内图像梯度的幅角和幅值(模值):

第三步:使用直方图统计邻域内像素的梯度方向和幅值,最后要形成一个梯度方向直方图,横轴为梯度方向角(将 0°~360° 的范围,分为36个柱,每10°为一个柱),纵轴为梯度方向角对应的梯度幅值累加值;

PS:算法目前为止仅考虑了尺度和旋转不变性。若每个加入梯度方向直方图的采样点都要进行高斯加权函数处理,其σ值为特征点尺度的1.5倍,则考虑进了仿射不变性。

第四步:找到特征点的主方向(梯度方向直方图的峰值)和辅方向(相当于主峰值的80%能量的峰值),即该特征点处邻域内图像梯度的主方向和辅方向。

PS-1:一个特征点具有多个方向可以增强匹配的鲁棒性。即将该特征点复制成多份特征点,并将方向值赋给复制之后的这些特征点。

PS-2:通常离散的梯度直方图要进行插值拟合处理,这样可以求得更精确的方向值角度。

第五步:确定SIFT特征区域。获得主方向之后,每个特征点由三个信息(x, y, σ, θ):位置、尺度、方向。我们通常使用一个带箭头的圆或者直接使用箭头来表示SIFT区域的三个值,其中,圆的中心表示特征点位置,圆的半径表示特征点的尺度(r=2.5σ),圆半径的箭头表示特征点的主方向。

3、特征点特征矢量生成

1)计算模型的生成原理

SIFT描述子h(x, y, θ)是对特征点附近邻域内高斯梯度图像梯度统计结果的一种表示,它是一个三维的阵列,但通常将它表示成一个矢量(通过三维阵列按一定规律进行排列得到的)。

在该尺度下的高斯图像上,以特征点为中心,取一个mσBp×mσBp大小的图像区域,并将其等间隔划分为Bp×Bp个子区域个子区域的尺寸为mσ个像元。其中m=3,Bp=4,σ为特征点的尺度值。

在上一点的基础上考虑进实际计算时,需要采用双线性插值,则计算的图像区域为mσ(Bp+1)。

在上一点的基础上再考虑旋转的因素,实际计算的图像区域应为mσ(Bp+1)√2。【如图6-7】

在上一点的基础上为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内的(mσ(Bp+1)√2×mσ(Bp+1)√2)图像梯度的位置和方向旋转一个方向角θ。【如图6-8】

PS:为什么最后其实只需要mσBp×mσBp大小的图像,但是却需要旋转(mσ(Bp+1)√2×mσ(Bp+1)√2)区域?

2)计算特征矢量

第一步:以特征点为中心,取一个mσBp×mσBp大小的图像区域,并将其等间隔划分为Bp×Bp个子区域个子区域的尺寸为mσ个像元。

第二步:在每个子区域内计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,形成一个种子点。

这里与求特征点主方向时有所不同,此时,每个子区域的梯度直方图将0°~360°划分为8个方向范围,每个范围为45°,每个种子点有8个方向的梯度强度信息,当Bp=4时,最终会形成4×4×8=128个数据,即形成了128维SIFT特征矢量。【如图6-9】

PS-1:对特征矢量需要进行高斯加权处理,加权采用方差为mσBp/2的标准高斯函数。

PS-2:特征矢量形成后,为了去除光照的变化,需要对它进行归一化处理,处理后,对于特征矢量中值大于0.2的要进行截断,然后再次进行归一化处理,其目的是为了提高特征的鉴别性。

你可能感兴趣的:(sift计算描述子代码详解)