sift解释

1.对原图像使用不同参数的高斯函数对图像进行卷积,得到一组Octave;相邻的图像相减得到一组DoG;
2.并把第一张Octave下采样重复步骤1;
3.使用不同尺度的DoG进行关键点检测;
4.在不同的尺度进行关键点方向分配;
5.以步骤4中的关键点的主方向为坐标轴方向,并记录一个指定范围内所有像素点的梯度方向(局部图像梯度),形成关键点描述符;
6.以一个图像中的关键点描述符去匹配另一个图像中的关键点描述符,设置一个阈值,并通过关键点描述符的欧式距离来比较关键点是否在阈值内
————————————————
版权声明:本文为CSDN博主「蓝莓山药」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20778015/article/details/83304708

I(x,y)表示原图像。

G(x,y,σ)表示高斯滤波器,其中G(x,y,σ)=12πσ2exp(−(x2+y2)/2σ2)

L(x,y,σ)表示由一个高斯滤波器与原图像卷积而生成的图像,即L(x,y,σ)=G(x,y,σ)⊗I(x,y)。一系列的σi,则可以生成一系列的L(x,y,σi)图像,此时我们把这一系列的L(x,y,σ)图像称为原图像的一个尺度空间表示。关于尺度空间的知识可以参考:图像特征提取:尺度空间理论

DOG表示高斯差分(Difference of Gaussians),也可以表示为D(x,y,σ),其中D(x,y,σ)=(G(x,y,kσ)–G(x,y,σ))⊗I(x,y)=L(x,y,kσ)–L(x,y,σ)

上面特别值得注意的是尺度为σ的高斯差分图像由于尺度为kσ与尺度为σ的L图像生成的。k为两相邻尺度空间倍数的常数。

O:高斯金字塔的组数(Octave),其中值得注意的是在实际构建中,第一组的索引可以为0也可以为-1,这个在后面解释原理。

S:高斯金字塔每一组的层数。在实际最开始构建尺度空间图像,即L图像的时候,构建了S+3层,一定要把这个S+3与S区分开,为什么是S+3后面分析。

 

图像金字塔:https://www.cnblogs.com/ronny/p/3886013.html

图像结构往往是在粗糙的尺度上被检测到,此时位置信息未必是最准确的,因此通常图像的尺度分析包含两个阶段:首先在粗尺度上进行特征(结构)检测,然后再在细尺度上进行精确定位。

3.4 尺度的选择[经验之谈] 这便是目标检测中的尺度效应(不能对所有的尺度都用一个分类器和回归器)和特征融合的必要性

一般我们采集到的图像中,我们并不知道我们感兴趣的目标在图像中的尺度,在这样的情况下,我们对图像进行分析时就无法选择合适的参数,比如边缘检测,可能由于参数不当,而造成过多的局部细节。

如下图所示:红色圆圈内的斑点的大小(直径)比例对应着两幅图像之间尺度比例(scale ratio)。如果对两幅图像采用相同的固定尺度的LoG检测器检测,很难将这两个斑点检测出来。LoG检测器相当于一个匹配滤波器,只有当LoG的尺度与图片中斑点结构尺度相当时才会有较强的响应。如果用与左图中斑点结构相当大小尺度LoG算子,在中的大斑点的对应的LoG响应很小不能被检测出来,反之亦然。因此固定尺度的LoG斑点检测器不具有尺度不变性。使用尺度空间进行多尺度检测可以将两幅图像中不同尺度的斑点检测出来。但是由于斑点结构是在一定尺度范围之内存在的,比如用5~8尺度的LoG可能都能检测出来右边图像中的斑点结构,所以在尺度空间中进行斑点检测会有重复检测的缺点。

 image

在实际操作中,我们需要定义一个特征响应函数,在不同的尺度空间上寻找一个极值点。比如小猫的金字塔图像分析时,我们定义了一个大小为[w,h]的小猫的模板,用这个模板去与金字塔系列图像匹配,一定有匹配度最佳(即特征响应最强)。

3.opencv的sift分析https://blog.csdn.net/NewThinker_wei/article/details/46707729

https://blog.csdn.net/weixin_33816300/article/details/86211269?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

for( int o = 0; o < nOctaves; o++ ) o表示第几组

for( int i = 1; i <= nOctaveLayers; i++ ) layer表示该组的第几层

r1,c1表示第几行,第几列

adjustLocalExtrema(dog_pyr, kpt, o, layer, r1, c1,
                                                nOctaveLayers, (float)contrastThreshold,
                                                (float)edgeThreshold, (float)sigma) )
 

static bool adjustLocalExtrema( const vector<Mat>& dog_pyr, KeyPoint& kpt, int octv,
                                int& layer, int& r, int& c, int nOctaveLayers,
                                float contrastThreshold, float edgeThreshold, float sigma )
 

    kpt.pt.x = (c + xc) * (1 << octv);
    kpt.pt.y = (r + xr) * (1 << octv);
    kpt.octave = octv + (layer << 8) + (cvRound((xi + 0.5)*255) << 16);
    kpt.size = sigma*powf(2.f, (layer + xi) / nOctaveLayers)*(1 << octv)*2;
    kpt.response = std::abs(contr);


————————————————
版权声明:本文为CSDN博主「NewThinker_wei」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/NewThinker_wei/article/details/46707729

3.计算得到的特征点间进行匹配

https://blog.csdn.net/weixin_44072651/article/details/89262277

发布了90 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32425195/article/details/104893549
今日推荐