SIFT算法相关的几个常见疑问

参考博客:

SIFT算法的Matlab实现
https://www.sun11.me/blog/2016/sift-implementation-in-matlab/

SIFT特征详解
https://www.cnblogs.com/wangguchangqing/p/4853263.html

下面我列一下博客中讲到,但涉及源码时又不够透彻的地方(其实是否透彻还是取决于个人的经验和理解)

用到的平滑叠加原理

对图像做一次\sigma_0的高斯平滑,再对图像做一次\sigma_1的高斯平滑,等效于对图像做一次\sigma =\sqrt{ \sigma_{0}^2+\sigma_{1}^2}的高斯平滑。

(1) σ的初始化

为了图像反走样的需要,通常假设输入图像是经过高斯平滑处理的,其值为\sigma_n=0.5,即半个像元。意思就是说我们采集到的图像I(x,y),已经被σ=\sigma_n=0.5的高斯滤波器平滑过了(事实上有没有滤波过和滤波的大小取决于照相机的算法,我们并不知道)。所以我们不能直接对I(x,y)\sigma_0的高斯滤波器平滑,而应该用\sigma = \sqrt{\sigma_0^2 - \sigma_n^2}的高斯滤波器去平滑I(x,y),即

FirstLayer(x,y) = I(x,y)\otimes G(x,y,\sqrt{\sigma_0^2 - \sigma_n^2})

进一步, 已经知到了I(x,y)看成是已经被\sigma_n=0.5模糊过的图像,那么第1层将I(x,y)放大2倍后得到I_s(x,y)则可以看为是被
2\sigma_n=1的高斯核模糊过的图像。所以,源码中体现的该组(octaves)中第一张图像的滤波就是这样的,

FirstLayer(x,y) = I_s(x,y)\otimes G(x,y,\sqrt{\sigma_0^2 - (2\sigma_n)^2})

再进一步,根据前面的原理,考虑同一组中,任一前后两张图片之间的σ的差别是

\sigma_{(diff,i)} = \sqrt{(\sigma_0k^{i+1})^2 - (\sigma_0 k^i)^2} = \sigma_0 k^{i} * \sqrt{k^2 - 1^2}

所以,为了构建连续的尺度空间,源代码中初始的σ取值是这样的

\sigma= \sigma_0 * \sqrt{k^2 - 1^2}

(2) 图像数目为什么是S+3 ?

要在S个差分图中寻找极值点,计算时就需要S+3张图像!因为S+3张图像可以得到S+2个差分图,进一步在判断(寻找)极值的时候,最前面那个和最后那个差分图是起辅助作用的,因为差分图中需要前后都有差分图才能在其中找极值(要有3张差分图,才能构成尺度空间找极值),这个关系就是

S+3张图像 -->> S+2张差分图  -->> 可在其中的S张差分图中找极值

这也就是下图的理解由来

(3)抛物线插值

这个各博客中都没提,我顺便推导了一下

根据抛物线插值公式,对三个点(-1,l), (0,c),(1,r)进行插值计算是这样的

y = \frac{l(x - 0)(x - 1)}{2} - c(x + 1)(x - 1) + \frac{r(x + 1)(x - 0)}{2}

对极值点,有

\frac{dy}{dx} = \frac{1}{2} (-4 c x+l (2 x-1)+2 r x+r) = 0

求解即得

x=\frac{r-l}{2 (l-2 c+r)}

(4)为什么使用DOG代替LOG?

SIFT的计算量无疑是很大的,使用近似的DOG代替LOG就是为了节省计算。 如下所示,DoG的系数是常数,在巨量的计算中,计算起来要快得多。

DOG
LoG\triangleq \bigtriangleup G_{\sigma}(x,y) = \frac{\partial^2}{\partial x^2} G_{\sigma}(x,y) + \frac{\partial^2}{\partial y^2} G_{\sigma}(x,y) = \frac{x^2+y^2-2\sigma^2}{\sigma^4}e^{-(x^2+y^2)/(2\sigma^2)}

LOG
DoG\triangleq =G_{\sigma_1}(x,y) - G_{\sigma_2}(x,y) =\frac{1}{\sqrt{2\pi}} \left( \frac{1}{\sigma_1}e^{-(x^2+y^2)/(2\sigma_1^2)} - \frac{1}{\sigma_2}e^{-(x^2+y^2)/(2\sigma_2^2)} \right)

我没有仔细考核,也没找到相关的具体指标,但找到了这个帖子,供参考

〈【计算机视觉】SIFT中LoG和DoG比较:https://blog.csdn.net/xiaowei_cqu/article/details/27692123

这里要注意:DoG需要在每层金字塔要多做一次高斯操作(即需要S+3张高斯模糊图来得到得到S+2张DoG图,而LoG只需要直接计算S+2张图像),但整体上,DoG通过减法取代LoG核大大减少了运算次数,节省了运算时间。

 

 

 

 

 

 

posted @ 2018-12-07 10:53  SpaceVision  阅读(62)  评论(0编辑  收藏  举报