目录
- SIFT是什么?
- 尺度空间理论
- SIFT特征点提取
- SIFT特征点描述
SIFT是什么?
SIFT ,即尺度不变特征变换( Scale-invariant feature transform,SIFT) ,一种特征描述方法。具有
尺度鲁棒性
旋转鲁棒性
光照鲁棒性
SIFT本身包括了特征点筛选及特征点描述的步骤。
尺度空间理论
SIFT的特征点筛选目的:寻找在不同尺度空间下的极值点,保证这些特征点在放大或者缩小的条件下均存在。
(这一特点与Harris检测特征点比较的话发现,Harris对尺度变换的鲁棒性较差)
SIFT的特征点筛选方法:DoG近似LoG。
LoG(Laplacian of Gaussian) :使用不同sigma获得不同的尺度空间图像,然后通过Laplacian算子获得极值。这一运算过程可以用DoG(Difference-of-Gaussian)近似。拉普拉斯其实就是二阶导数,产生的零交叉点就是我们所要获取的极值。
关于LoG与DoG的更多知识可以转到:图像分割-LOG检测器和DOG检测器
DoG步骤:
得到的结果与LoG结果非常相似,在DoG结果图中,我们用亮度表达差分值的大小。在纹理比较丰富、边缘区域具有比较大的值。
理解:高斯卷积核其实是一种加权的平均。在灰度变化不剧烈的地区,一个像素值的大小和周围像素值得大小基本相等,所以不管加权的参数是哪样,得到的加权结果其实是相似的,所以做差分之后这种区域的差分值会很小。灰度变化剧烈的地区则反之,差分值会很大。
SIFT特征点提取
在SIFT特征点选取中所用到的DoG:
这时候就出现了一个问题:随着sigma的增加,它需要更大的高斯窗口进行平滑模糊处理。(sigma越大高斯函数越扁平)会使无法处理的区域增加,同时计算量增加。在空间滤波中我们学习到,3* 3模板进行卷积时对图像最外一层像素是无法处理的,5*5是周围两层像素。
解决方法:图像金字塔,回顾知识:Opencv——图像金字塔与图像尺寸缩放
当k增加到2时,我们将图像缩小为1/2尺寸,这叫降采样。再使用sigma0的模板处理。我们发现,图像缩小了二分之一,而sigma却没有改变。重复该操作,进行降采样。同一个Octave的图像具有相同的尺寸。
在图像金字塔处理之后,我们将就是检测DoG极值了。
关于获取一个octave的图像的详细过程可以参考文章最末的原理讲解,那个是十分详细的。
这样得出来的极值的性质如何?
当然这些得到的极值点是候选点。在得到候选点之后就要对候选点的特征进行描述,以达到匹配的目的。
SIFT特征点描述
使用梯度值对特征点进行表述,计算像素的梯度值和梯度方向。相对像素的亮度值,梯度对光照具有更好的鲁棒性。
当图像处于一个刚体状态时(没有剧烈形变),某像素与它周围像素的关系应该是近乎恒定的。对一个区域进行描述的话得到的描述子将更加稳定。
我们先假设一个候选点:
然后计算它周围一定区域的梯度值,比如8*8区域。
1、将得到的角度值进行36等分。
2、在特征点对应的尺度空间计算梯度值。
3、利用高斯核对梯度进行计算权重。
也就是说该像素周围像素的权重由两个值决定:一个是本身梯度大小、第二个是离考察像素点的距离。
建立一个36维的直方图,每次累加的值就是它的权重
其实到了这一步已经可以很好地描述了。
但是注意,此刻的角度计算得到的是一个绝对角度,是与水平方向成的角度。当图像旋转后显然这种描述方法就有问题了。
解决方法:获取一个具有代表性的方向作为主方向。通常选择梯度值最大的那个角度分量作为主方向,获得更具有旋转鲁棒性的描述方法。
选择完主方向后,将周围图像以主方向计算相对角度。这样就算图像进行旋转,主方向也会进行旋转,相对角度保持相对恒定状态。
代码实现可以参考第二个链接。
要是想要调用Opencv库函数,则要参考毛星云的《Opencv3编程入门的》417页,
我在我的Opencv安装包中没有找到这个nonfree文件夹,以后再解决这个问题。网上大部分调库代码也需要一些自己添加库。
参考链接:
SIFT算法详解
基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
《数字图像处理PPT.李竹版》