文章主要参考:
https://blog.csdn.net/lingyunxianhe/article/details/79063547
- 算法介绍
- SIFT算法步骤
- 图像金字塔
- 空间极值点检测
- 关键点方向分配
- 特征点描述符
- API即openCV应用
1.算法介绍
SIFT--尺度不变特征转换算法(Scale-invariant feature transform),通常用来侦测与描述影像中的局部性特征,在空间尺度中寻找极值点,并提取出其位置,尺度,旋转不变量。
SIFT的应用范围包括物体识别,机器人感知与导航,3D模型建立,影像追踪等。
局部影像特征的描述与侦测可以帮助识别物体,**SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关**
**SIFT算法的实质是在不同的尺度空间上查找关键点**,并计算出关键点的方向。SIFT所查找到的关键点十分突出,不会因光照,噪音而变化
2.SIFT算法步骤
3.图像金字塔
3.1、高斯金字塔
高斯金字塔是采用高斯函数对图像进行模糊以及降采样处理得到的。
高斯模糊系数计算公式:
高斯函数与图像卷积
分离高斯卷积
3.2的图像卷积方法,速度比较慢,同时图像边缘信息也会损失严重。可以使用分离的高斯卷积(即先用1XN的模板沿着X方向对图像卷积一次,然后用NX1的模板沿着Y方向对图像再卷积一次,其中N=[(6σ+1)]且向上取最邻近奇数),这样即省时,也见笑了直接卷积对图像边缘信息的算是
高斯金字塔源码
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;//返回建好的金字塔
3.2 高斯差分金字塔
高斯差分函数(DOG算子)的极大值和极小值能够产生比较稳定的图像特征,与尺度归一化的高斯拉普拉斯函数比较近似。
其中k-1是个常熟,不影响极值点位置的求取
差分金字塔的建立
差分金字塔实在高斯金字塔的基础上操作的,其建立过程就是:在高斯金字塔中的每组中相邻两层相减(下一层减上一层,就生成了高斯差分金字塔)
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;//返回高斯差分金字塔
4.空间极值点(关键点)检测
关键点是由DOG空间的局部极值点组成,关键点的初步探索是通过同一组内各DOG相邻两层图像之间比较完成的。为了寻找DOG函数的极值点,每一个像素点要和它相邻点比较,看是否比它的图像域和尺度域的相邻点大或者小。如下图所示ÿ