SIFT算法的个人理解——理论篇
1. 前言
本人目前共使用过两个版本的sift算法:
(1)Matlab中的sift算法,可以从http://www.cs.ubc.ca/~lowe/keypoints/下载Lowe团队写的sift演示代码;
(2)opencv中的sift算法(本人使用的opencv版本是2.4.9),可以从http://opencv.org/下载opencv的各个版本,建议不要用太新的版本,容易出现一些小问题。本篇文章主要总结一下本人最近在做项目的过程当中学习和使用sift算法所遇到的问题,一方面可以和大家在网上交流学习,另一方面可以方便自己以后查阅和复习。
2. SIFT中常见问题
首先还是介绍一下sift算法的主要步骤:(1)建立尺度空间,主要是指建立,Gaussian金字塔和DoG金子塔;(2)在尺度空间中寻找极值点(keypoints),并对其进行精确定位;(3)求解关键点的梯度幅值和幅角;(4)对关键点进行描述,形成128维的空间向量。
在步骤(1)当中大家需要明白的问题是:(1)什么是尺度?尺度空间中的尺度又是什么?(2)如何建立Gaussian金字塔?(3)如何建立DoG金字塔?(4)为什么要建立尺度空间,不建立尺度空间可以吗?这些问题也是我当初学习的时候遇到的问题,接下来就这些问题谈一谈我自己的认识,希望对大家有所帮助;
问题(1)我举一个简单的例子,相信大家就会明白了,比如你站在远处看一棵树木,你只能看见它的一簇树叶,而当你离树木越来越近的时候,你可以看见单个的树叶,而当你再靠近的时候,你就会看见树叶上的纹络。而在尺度空间当中的尺度在我理解是指图像的大小,对于同一张图像,图像的尺寸越大图像的尺度越大,图像越模糊;尺度越小图像越清晰。而图像中的细节可以在小的尺度上面找到,轮廓可以在大的尺度上面找到。
问题(2)建立高斯金字塔主要包括两个步骤:(a)对图像进行高斯模糊,即通过高斯掩膜对图像进行求卷积(b)对高斯模糊之后的图像进行降采样,即对图像中行和列的像素隔行删除。如示意图1所示
图1 Gaussian金字塔和DoG金字塔的建立示意图
图1左边的是Gaussian金字塔,右边的是DoG金字塔(后面会介绍到),图中octave--组,Layer--层,scale--尺度。如上图Gaussian第一组(first octave)中共有5层,包括0,1,2,3,4 ,第二组(second octave)中共有5层,包括0,1,2,3,4 。第一组的第0层是原始图像放大一倍后得到的,第1层是由第0层经过高斯平滑后得到的,... ,第4层是由第3层经过高斯平滑得到的;而第二组的第0层是由第1组的倒数第三张图像降采样得到的(这个地方是个难点,后面会讲到为什么是这个样子),接下来的步骤和第一组当中是一样的,不