现在的位置: 首页 > 综合 > 正文

sift学习备注4 ,特征检测,wikipedia中的文章,对sift,surf等都有解释,

2014年01月23日 ⁄ 综合 ⁄ 共 1291字 ⁄ 字号 评论关闭

特征检测 wiki

 http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

慢慢看。

又开始学习sift,第一个问题是why gaussian?这个问题可以参看wikipedia中scale space条目

why DOG?

不同的图像缩放算法对结果又影响吗?

 

sift_vc代码的理解

 

1.图像是在32位浮点数[0,1]计算的,所以先要把图像转换到32f表示,同时做 1/255.0,归一到[0,1].

2.关于presigma一般都指定为0.5

3.sift-vc里octaves是通过一个公式求的octvs = log( MIN( init_img->width, init_img->height ) ) / log(2) - 2;

4.sift-vc中输入图像预处理有个

    sig_diff = sqrt( sigma * sigma - SIFT_INIT_SIGMA * SIFT_INIT_SIGMA * 4 );

    如果不放大是

   sig_diff = sqrt( sigma * sigma - SIFT_INIT_SIGMA * SIFT_INIT_SIGMA );

   sig_diff传递给cvsmooth函数cvSmooth( dbl, dbl, CV_GAUSSIAN, 0, 0, sig_diff, sig_diff );

   cvsmooth可以指定高斯核的大小来计算高斯核的标准差,也可以指定标准差来计算高斯核的大小。计算公式可以参考openc的手册

和源代码。其中通过标准差来计算核大小用的比较多。有个3sigma规则。cvsmooth中3*3,5*5,7*7的核是预定义的。

这里不明白的是为什么用sig_diff?看了后面的构建高斯金字塔的内容。计算sig[i]也是用sig_diff的公式,

网上有个pdf 《关于SIFT和RANSAC算法的一个slides.pdf》提到了这些问题。

高斯卷积看http://zh.wikipedia.org/wiki/%E9%AB%98%E6%96%AF%E6%A8%A1%E7%B3%8A

先总结如下:下一级图像的sigma是上一级的k倍,高斯卷积符合公式

g(x,sigma^2) = g(x,sigma1^2)*g(x,sigma2^2)
假设原图有sift_init_sigma的模糊,第一张图的标准差是sigma,则从sift_init_sigma的图到sigma的图,用的高斯核不能使sigma
而是 sqrt( sigma * sigma - SIFT_INIT_SIGMA * SIFT_INIT_SIGMA );
同样的,下一个图的sigma是k*sigma,我们可以直接用ksigma来求,但用小的sigma计算速度快,根据高斯卷积的性质,如果当前图的原图经过(k-1)sigma卷积得到的,,下个图是原图经过k*sigma的高斯核得到的。则从当前图到下个图,可以用高斯核
sqrt(ksigma^2-(k-1)^2sigma^2),对当前图做卷积得到。这个核比k*sigma 小,所以速度快些。
感谢网友ynyu,opencv群和图像识别群的朋友的帮助。
参看图
【上篇】
【下篇】

抱歉!评论已关闭.