SIFT算法相关的几个常见疑问
参考博客:
SIFT算法的Matlab实现
https://www.sun11.me/blog/2016/sift-implementation-in-matlab/
SIFT特征详解
https://www.cnblogs.com/wangguchangqing/p/4853263.html
下面我列一下博客中讲到,但涉及源码时又不够透彻的地方(其实是否透彻还是取决于个人的经验和理解)
用到的平滑叠加原理
对图像做一次的高斯平滑,再对图像做一次的高斯平滑,等效于对图像做一次的高斯平滑。
(1) σ的初始化
为了图像反走样的需要,通常假设输入图像是经过高斯平滑处理的,其值为=0.5,即半个像元。意思就是说我们采集到的图像,已经被σ==0.5的高斯滤波器平滑过了(事实上有没有滤波过和滤波的大小取决于照相机的算法,我们并不知道)。所以我们不能直接对用的高斯滤波器平滑,而应该用的高斯滤波器去平滑,即
进一步, 已经知到了看成是已经被=0.5模糊过的图像,那么第1层将放大2倍后得到则可以看为是被
2=1的高斯核模糊过的图像。所以,源码中体现的该组(octaves)中第一张图像的滤波就是这样的,
再进一步,根据前面的原理,考虑同一组中,任一前后两张图片之间的σ的差别是
所以,为了构建连续的尺度空间,源代码中初始的σ取值是这样的
(2) 图像数目为什么是S+3 ?
要在S个差分图中寻找极值点,计算时就需要S+3张图像!因为S+3张图像可以得到S+2个差分图,进一步在判断(寻找)极值的时候,最前面那个和最后那个差分图是起辅助作用的,因为差分图中需要前后都有差分图才能在其中找极值(要有3张差分图,才能构成尺度空间找极值),这个关系就是
S+3张图像 -->> S+2张差分图 -->> 可在其中的S张差分图中找极值
这也就是下图的理解由来
(3)抛物线插值
这个各博客中都没提,我顺便推导了一下
根据抛物线插值公式,对三个点进行插值计算是这样的
对极值点,有
求解即得
(4)为什么使用DOG代替LOG?
SIFT的计算量无疑是很大的,使用近似的DOG代替LOG就是为了节省计算。 如下所示,DoG的系数是常数,在巨量的计算中,计算起来要快得多。
DOG
LOG
我没有仔细考核,也没找到相关的具体指标,但找到了这个帖子,供参考
〈【计算机视觉】SIFT中LoG和DoG比较:https://blog.csdn.net/xiaowei_cqu/article/details/27692123〉
这里要注意:DoG需要在每层金字塔要多做一次高斯操作(即需要S+3张高斯模糊图来得到得到S+2张DoG图,而LoG只需要直接计算S+2张图像),但整体上,DoG通过减法取代LoG核大大减少了运算次数,节省了运算时间。