图像特征提取方法详解系列—SIFT


前言

图像特征提取方法有很多种,本文将对一种图像特征提取方法——SIFT进行详细的介绍,主要包括SIFT算法的算法逻辑。

一、SIFT是什么?

SIFT算法的全称是尺度不变特征转换(Scale-invariant feature transform,SIFT),该算法是一种用来侦测和描述影像中的局部性特征的计算机视觉算法,它在尺度空间(通过高斯图像差分得到与DoG近似的LoG图像金字塔)中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由David Lowe在1999年首次发表,并在2004年得到完善总结。

二、算法步骤

1.生成高斯尺度空间

高斯函数是唯一可以产生多尺度空间的核,构造高斯尺度空间的目的是为了检测出在不同的尺度下都存在的特征点。输入图像通过高斯核函数连续对尺度进行变化(尺度变量\sigma越大,图像越模糊,对应的尺度越大)。高斯函数如公式(1)所示:

 

高斯函数处理图像过程如公式(2)所示,其中I(x,y)表示输入图像,G(x,y,\sigma)表示尺度为\sigma的高斯核函数,L(x,y,\sigma)表示高斯函数处理后的图像。

2.构造高斯差分金字塔

构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,而检测特征点较好的算子是高斯拉普拉斯算子(LoG),其公式见公式(3)。

使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussian)来近似计算LoG。设k为相邻两个高斯尺度空间的比例因子,则DoG的定义如公式(4)所示,L(x,y,\sigma)表示高斯尺度空间,D(x,y,\sigma)为高斯差分图像。

从上式可以知道,将相邻的两个高斯空间的图像相减就得到了DoG的响应图像。为了得到DoG图像,先要构建高斯尺度空间,而高斯的尺度空间可以在图像金字塔降采样的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的参数\sigma进行高斯模糊,使每层金字塔有多张高斯模糊过的图像。降采样时,金字塔上边一组图像的第一张是由其下面一组图像倒数第三张降采样得到。 

重要补充:

易知,高斯金字塔有多组,每组又有多层。高斯金字塔的组数一般由公式(5)计算所得,o表示高斯金字塔的层数,m,n分别是图像的行和列。减去的系数a可以在0−log2min(m,n)之间的任意值,和具体需要的金字塔的顶层图像的大小有关。

 一组中的多个层之间的尺度是不一样的(也就是使用的高斯参数\sigma是不同的),相邻两层之间的尺度相差一个比例因子k。如果每组用于寻找极值点的差分图像有S层,第o组的第s层图像尺度如公式(6)所示,组内每层的尺度坐标按公式(7)计算。

为了保持高斯差分金字塔的尺度空间(即高斯模糊系数)的连续性,下一个组的第1层由上一组中的倒数第3层直接降采样不需要模糊产生。

3.DoG空间寻找极值点(运算完该部分关键点包含坐标和尺度信息)

首先,通过阈值化去除噪声点(一般在找到亚像素位置后进行筛选,为了加快速度可以放在寻找极值点之前,这里过滤了低对比度点后面就不再过滤了),阈值化公式如公式(8)所示,其中val表示当前像素点的值,T由自己设置,一般设置为0.04,n是寻找极值点的尺度空间层数。

为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。

从上面的描述中可以知道,每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有S+3层图像,DoG金字塔的每组有S+2组图像。

4.极值点的亚像素定位

如图1所示,在离散情况下,由上述方法寻找到的极值点是坐标为整数的像素位置,考虑连续的情况,则极值点可能落在该点的附近区域,为了更精确的得到极值的位置,需要使用Talor展开式来确定极值点的亚像素位置,下面以一维函数为例说明。在点x附近的邻域内的点,其泰勒展开式如下:

对其两边求导,若存在极值点,则函数 导数为0,可以推出:

  • 当然,在算法实现时,我们求得真实极值点是一个迭代的过程(一般最多5次)。有三种情况:
  • (1)设置的迭代条件:三个分量x、y、σ均小于0.5时,方可成立,此时位移量已经足够小了,我们就认为已经收敛了。
  • (2)出现函数不收敛的情况,那我们将这么点直接舍去。
  • (3)函数已经收敛,但解超出了一定范围,舍去。

消除边缘效应。在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小,应该尽量筛掉边缘的点,因为他们只有一个方向有极值,容易导致无法唯一地描述,影响后续匹配。边缘点可以通过Hessian矩阵的特征值的比值来找到,即边缘点Hessian矩阵的两个特征值会相差很大。Hessian矩阵如公式(11)所示,海参矩阵可以描述函数的局部曲率。我们希望某个点在x、y两个方向的曲率差不多,否则的话它很可能是一个边缘点。根据数学上的概念,海参矩阵的特征值和曲率是呈正比的。此处我们不去算它的特征值,太麻烦了。通过引入迹和行列式来代替大特征值\alpha和小特征值\beta的关系。

利用公式(12)以及公式(13)分别可以得到迹Tr(H)和行列式的值Det(H)

\alpha=\gamma \beta,则有:

(1)若Det(H)<0,说明两个特征值已经异号了,也就是曲率肯定是不接近的,存在边缘效应,直接舍去当前X点。

(2)若Det(H)>0且\alpha>\beta\gamma>1时是一个单调递增函数,在\gamma=1时取最小值。\gamma的值越小则曲率越低,因此我们为\gamma设置一个阈值,一般建议取10。

5.求取特征点的主方向

 找到了特征点,也就可以得到该特征点的尺度\sigma,也就可以得到特征点所在的尺度图像:

经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。

计算以特征点为中心、以3×1.5\sigma为半径的区域图像的幅角和幅值,每个点L(x,y)的梯度的模m(x,y)以及方向\theta(x,y)可通过下面公式求得:

 

 计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每10度一个柱共36个柱,或者每45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近邻域点对关键点方向的作用,并减少突变的影响。为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出15%的关键点具有多方向,而且这些点对匹配的稳定性很关键。

 得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,\sigma,\theta),即位置、尺度和方向,由此可以确定一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

6.生成特征描述子

 

通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点,也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点,描述子应具有较高的独立性,以保证匹配率。特征描述符的生成大致有三个步骤:

6.1 校正旋转主方向,确保旋转不变性。

为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转\theta(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:

6.2 生成描述子,最终形成一个128维的向量

旋转后以主方向为中心取 8×8的窗口。求取每个像素的梯度幅值与梯度方向,然后利用高斯窗口对其进行加权运算,计算每个梯度方向的累加值,即可形成一个种子点。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。与求主方向不同,此时每个种子区域的梯度直方图在0-360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息。在实际的计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。

6.3 归一化处理

将特征向量长度进行归一化处理,进一步去除光照的影响。 

三、总结

以上就是今天要讲的内容,本文详细介绍了SIFT的算法逻辑。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值