埃及胡夫金字塔 皇后金字塔_特征金字塔图像分类_特征金字塔

小白学视觉公众号开始有偿征稿啦~~~,有兴趣的小伙伴可以查看

计算机视觉中的特征点提取算法比较多特征金字塔,但SIFT除了计算比较耗时以外,其他方面的优点让其成为特征点提取算法中的一颗璀璨的明珠。SIFT算法的介绍网上有很多比较好的博客和文章,我在学习这个算法的过程中也参看网上好些资料,即使评价比较高的文章,作者在文章中对有些比较重要的细节、公式来历没有提及,可能写博客的人自己明白,也觉得简单,因此就忽略了这些问题,但是对刚入门的人来说,看这些东西,想搞清楚这些是怎么来的还是比较费时费力的。比如SIFT算法中一个重要的操作:求取描述子的主方向。好多文章只是一提而过或忽略,然后直接给出一个公式,SIFT算法的原作者也提使用抛物线插值,但是具体怎么插的就不太详尽了,对于初学者来说更是不知所云。因此本文打算在参看的文章上对有关这些细节给出一些比较详细的说明,还有本文尽量对操作过程配备对应图片或示意图说明,同时附上robwhesss开源SIFT C代码对应程序块并给予注解,方便理解。

但是由于文章内容比较长,因此会分几次陆续的为小伙伴们介绍。

算法简介

尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

局部影像特征的描述与侦测可以帮助辨识物体,SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

SIFT算法流程图

埃及胡夫金字塔 皇后金字塔_特征金字塔图像分类_特征金字塔

1、图像金字塔

1.1、高斯金字塔

图像高斯金字塔(Gaussian Pyramid)是采用高斯函数对图像进行模糊以及降采样处理得到。其形成过程可如下图所示:

埃及胡夫金字塔 皇后金字塔_特征金字塔_特征金字塔图像分类

其中高斯模糊系数计算公式如下:

埃及胡夫金字塔 皇后金字塔_特征金字塔_特征金字塔图像分类

1.1.1、高斯函数与图像卷积

根据3σ原则,使用NxN的模板在图像每一个像素点处操作,其中N=[(6σ+1)]且向上取最邻近奇数。

其操作如下图:

1.1.2、分离高斯卷积

上面这样直接与图像卷积,速度比较慢,同时图像边缘信息也会损失严重。后来,不知哪位学者发现,可以使用分离的高斯卷积(即先用1xN的模板沿着X方向对图像卷积一次,然后用Nx1的模板沿着Y方向对图像再卷积一次特征金字塔,其中N=[(6σ+1)]且向上取最邻近奇数),这样既省时也减小了直接卷积对图像边缘信息的严重损失。

1.1.3、高斯金子塔源码分析

for (o = 0; o < octvs; o++)//金字塔组数为octvs,
 for (i = 0; i < intvls + 3; i++)//每一组有intvls + 3 层,intvls一般为3
   {
   if (o == 0 && i == 0)//如果是第一组第1层
     gauss_pyr[o][i] = cvCloneImage(base);//base 为原始灰度图像经过升采样或降采样得到的图像
 /* base of new octvave is halved image from end of previous octave */
   else if (i == 0)//建立非第一组的第1层
     gauss_pyr[o][i] = downsample(gauss_pyr[o - 1][intvls]);//降采样图像
   /* blur the current octave's last image to create the next one */
   else//建立非第一组的非第1层
     {
     gauss_pyr[o][i] = cvCreateImage(cvGetSize(gauss_pyr[o][i - 1]),IPL_DEPTH_32F, 1);
     cvSmooth(gauss_pyr[o][i - 1], gauss_pyr[o][i],CV_GAUSSIAN, 0, 0, sig[i], sig[i]);// sig[i]为模糊系数
     }//cvSmooth 为平滑处理函数,也即模糊处理。CV_GAUSSIAN 为选用高斯函数对图像模糊
 return gauss_pyr;//返回建好的金字塔

1.2、高斯差分金字塔

2002年Mikolajczyk在详细的实验比较中发现尺度归一化的高斯拉普拉斯函数的极大值和极小值同其它的特征提取函数,例如:梯度,Hessian或Harris角特征比较,能够产生最稳定的图像特征。而Lindeberg早在1994年就发现高斯差分函数(简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似。如下式:

特征金字塔_埃及胡夫金字塔 皇后金字塔_特征金字塔图像分类

其中k-1是个常数,并不影响极值点位置的求取。

1.2.1、差分金字塔的建立

差分金字塔的是在高斯金字塔的基础上操作的,其建立过程是:在高斯金子塔中的每组中相邻两层相减(下一层减上一层)就生成高斯差分金字塔.

高斯差分金字塔其操作如下图:

1.2.2、差分金字塔源码分析

for (o = 0; o < octvs; o++)//octvs为高斯金字塔组数
 for (i = 0; i < intvls + 2; i++)//因为相减,故高斯金字塔中每组有(intvls + 2)层图像
   {
   dog_pyr[o][i] = cvCreateImage(cvGetSize(gauss_pyr[o][i]),IPL_DEPTH_32F, 1);
   cvSub(gauss_pyr[o][i + 1], gauss_pyr[o][i], dog_pyr[o][i], NULL);//cvSub为opencv内置相减函数
   }
 return dog_pyr;//返回高斯差分金字塔

本文由作者首发在CSDN,授权转载,禁止二次转载