引言: 在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的介绍:九、图像特征提取与匹配之 SIFT算法,而后在:九(续)、sift算法的编译与实现里,我也简单记录下了如何利用 opencv,gsl等库编译运行 sift程序。 但据一朋友表示,是否能用 c语言实现 sift算法,同时,尽量不用到 opencv,gsl等第三方库之类的东西。而且,Rob Hess维护的sift 库,也不好懂,有的人根本搞不懂是怎么一回事。 那么本文,就教你如何利用 c语言一步一步实现 sift算法,同时,你也就能真正明白 sift算法到底是怎么一回事了。 ok,先看一下,本程序最终运行的效果图,sift 算法分为五个步骤(下文详述),对应以下第二 --第六幅图: sift算法的步骤 要实现一个算法,首先要完全理解这个算法的原理或思想。咱们先来简单了解下,什么叫sift算法: sift,尺度不变特征转换,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。 所谓,Sift算法就是用不同尺度(标准差)的高斯函数对图像进行平滑,然后比较平滑后图像的差别, 差别大的像素就是特征明显的点。 以下是sift算法的五个步骤: 一、建立图像尺度空间(或高斯金字塔),并检测极值点 首先建立尺度空间,要使得图像具有尺度空间不变形,就要建立尺度空间,sift算法采用了高斯函数来建立尺度空间,高斯函数公式为: G(x,y,e) = [1/2*pi*e^2] * exp[ -(x^2 + y^2)/2e^2] 上述公式 G(x,y,e),即为尺度可变高斯函数。 而,一个图像的尺度空间L(x,y,e) ,定义为原始图像I(x,y)与上述的一个可变尺度的2维高斯函数G(x,y,e) 卷积运算。 即,原始影像 I(x,y)在不同的尺度 e下,与高斯函数 G(x,y,e)进行卷积,得到 L(x,y,e),如下: L(x,y,e) = G(x,y,e)*I(x,y) 以上的(x,y)是空间坐标, e,是尺度坐标,或尺度空间因子,e的大小决定平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的 e值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。 尺度,受 e这个参数控制的表示。而不同的 L(x,y,e)就构成了尺度空间,具体计算的时候,即使连续的高斯函数,都被离散为(一般为奇数大小)(2*k+1) *(2*k+1)矩阵,来和数字图像进行卷积运算。 随着 e的变化,建立起不同的尺度空间,或称之为建立起图像的...