经典算法研究系列:九、图像特征提取与匹配之SIFT算法

article/2025/10/26 12:32:11

      经典算法研究系列:九、SIFT算法研究

作者:July、二零一一年二月十五日。

推荐阅读:
David G. Lowe, "Distinctive image features from scale-invariant keypoints,"
International Journal of Computer Vision, 60, 2 (2004), pp. 91-110
---------------------------------------------

尺度不变特征转换(Scale-invariant feature transform SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。

Sift算法就是用不同尺度(标准差)的高斯函数对图像进行平滑,然后比较平滑后图像的差别,
差别大的像素就是特征明显的点。   

一、Sift算法的步骤
Sift(Scale Invariant Feature Transform)是一个很好的图像匹配算法,
同时能处理亮度、平移、旋转、尺度的变化,利用特征点来提取特征描述符,最后在特征描述符之间寻找

匹配。
该算法主要包括5个步骤进行匹配:
1、构建尺度空间,检测极值点,获得尺度不变性;
 

 

2、特征点过滤并进行精确定位,剔除不稳定的特征点;

 

3、在特征点处提取特征描述符,为特征点分配方向值;

 

4、生成特征描述子,利用特征描述符寻找匹配点;
以特征点为中心取16*16的邻域作为采样窗口,
将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,
最后获得4*4*8的128维特征描述子。
示意图如下:

 

5、计算变换参数。
 当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中

关键点的相似性判定度量。
取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。
在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。

 

最后,看下Sift 算法效果图:
下图左边部分Sift算法匹配结果,右边部分是其它算法匹配结果:

 

二、Sift算法的描述
在上述的Sift算法步骤一中,提到了尺度空间,那么什么是尺度和尺度空间呢?
尺度就是受delta这个参数控制的表示。
而不同的L(x,y,delta)就构成了尺度空间,实际上,具体计算的时候,即使连续的高斯函数,都要被离

散为(一般为奇数大小)(2*k+1) *(2*k+1)矩阵,来和数字图像进行卷积运算。

David Lowe关于Sfit算法,2004年发表在Int. Journal of Computer Vision的经典论文中,
对尺度空间(scal space)是这样定义的 :
   It has been shown by Koenderink (1984) and Lindeberg (1994) that under a variety of
reasonable assumptions the only possible scale-space kernel is the Gaussian function.

Therefore,the scale space of an image is defined as a function, L(x; y; delta) that is

produced from the convolution of a variable-scale Gaussian, G(x; y; delta), with an input

image, I(x; y):

因此 ,一个图像的尺度空间,L(x,y,delta) ,
定义为原始图像I (x,y)与一个可变尺度的2维高斯函数G(x,y,delta) 卷积运算。

即,原始影像I(x,y)在不同的尺度e下,与高斯滤波器G(x,y,e)进行卷积,得到L(x,y,e),如下:
        L(x,y,e) = G(x,y,e)*I(x,y)
 
其中G(x,y,e)是尺度可变高斯函数,
        G(x,y,e) = [1/2*pi*e2] * exp[ -(x2 + y2)/2e2]
(x,y)是空间坐标, e是尺度坐标。


为了更有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。
利用不同尺度的高斯差分核与原始图像I(x,y) ,卷积生成。

        D(x,y,e) = ((G(x,y,ke) - G(x,y,e)) * I(x,y)
                              = L(x,y,ke) - L(x,y,e)
DOG算子计算简单,是尺度归一化的LoG算子的近似。

 

Gaussian卷积是有尺寸大小的,使用同一尺寸的滤波器对两幅包含有不同尺寸的同一物体的图像求局部最值将有可能出现一方求得最值而另一方却没有的情况,但是容易知道假如物体的尺寸都一致的话它们的局部最值将会相同。

SIFT的精妙之处在于采用图像金字塔的方法解决这一问题,我们可以把两幅图像想象成是连续的,分别以它们作为底面作四棱锥,就像金字塔,那么每一个 截面与原图像相似,那么两个金字塔中必然会有包含大小一致的物体的无穷个截面,但应用只能是离散的,所以我们只能构造有限层,层数越多当然越好,但处理时 间会相应增加,层数太少不行,因为向下采样的截面中可能找不到尺寸大小一致的两个物体的图像。

有了图像金字塔就可以对每一层求出局部最值,但是这样的稳定 点数目将会十分可观,所以需要使用某种方法抑制去除一部分点,但又使得同一尺度下的稳定点得以保存
图像金字塔的构建:图像金字塔共O组,每组有S层,下一组的图像由上一组图像降采样得到。
如下图:

 

三、Sift算法的实现
作为一种匹配能力较强的局部描述算子,SIFT算法的实现相当复杂,
不过David Lowe到底也还是用c++实现了它,头文件里就下述两个关键函数,下面具体阐述下。

函数一:
int sift_features( IplImage* img, struct feature** feat )
这个函数就是用来提取图像中的特征向量。
参数img为一个指向IplImage数据类型的指针,用来表示需要进行特征提取的图像。
IplImage是opencv库定义的图像基本类型(关于opencv是一个著名的图像处理类库,详细的介绍可以参见(http://www.opencv.org.cn)。

参数feat 是一个数组指针,用来存储图像的特征向量。
函数调用成功将返回特征向量的数目,否则返回-1.

函数,完整表述如下:

int sift_features( IplImage* img, struct feature** feat )
{return _sift_features( img, feat, SIFT_INTVLS, SIFT_SIGMA, SIFT_CONTR_THR,SIFT_CURV_THR, SIFT_IMG_DBL, SIFT_DESCR_WIDTH,SIFT_DESCR_HIST_BINS );
}

如你所见,函数一sift_features调用下面的函数二。


函数二:
int _sift_features( IplImage* img, struct feature** feat, int intvls,double sigma, double

contr_thr, int curv_thr, int img_dbl, int descr_width, int descr_hist_bins )

稍微介绍下此函数的几个参数:
intvls: 每个尺度空间的采样间隔数,默认值为3.
sigma: 高斯平滑的数量,默认值1.6.
contr_thr:判定特征点是否稳定,取值(0,1),默认为0.04,这个值越大,被剔除的特征点就越多。
curv_thr:判定特征点是否边缘点,默认为6.
img_dbl:在建立尺度空间前如果图像被放大了1倍则取值为1,否则为0.
descr_width:计算特征描述符时邻域子块的宽度,默认为4.
descr_hist_bins:计算特征描述符时将特征点邻域进行投影的方向数,默认为8,分别是0,45,90,135

,180,215,270,315共8个方向。

以下是此函数二的完整表述:

int _sift_features( IplImage* img, struct feature** feat, int intvls,double sigma, double contr_thr, int curv_thr,int img_dbl, int descr_width, int descr_hist_bins )
{IplImage* init_img;IplImage*** gauss_pyr, *** dog_pyr;CvMemStorage* storage;CvSeq* features;int octvs, i, n = 0;/* check arguments */if( ! img )fatal_error( "NULL pointer error, %s, line %d",  __FILE__, __LINE__ );if( ! feat )fatal_error( "NULL pointer error, %s, line %d",  __FILE__, __LINE__ );/* build scale space pyramid; smallest dimension of top level is ~4 pixels */init_img = create_init_img( img, img_dbl, sigma );octvs = log( MIN( init_img->width, init_img->height ) ) / log(2) - 2;gauss_pyr = build_gauss_pyr( init_img, octvs, intvls, sigma );dog_pyr = build_dog_pyr( gauss_pyr, octvs, intvls );storage = cvCreateMemStorage( 0 );features = scale_space_extrema( dog_pyr, octvs, intvls, contr_thr,curv_thr, storage );calc_feature_scales( features, sigma, intvls );if( img_dbl )adjust_for_img_dbl( features );calc_feature_oris( features, gauss_pyr );compute_descriptors( features, gauss_pyr, descr_width, descr_hist_bins );/* sort features by decreasing scale and move from CvSeq to array */cvSeqSort( features, (CvCmpFunc)feature_cmp, NULL );n = features->total;*feat = calloc( n, sizeof(struct feature) );*feat = cvCvtSeqToArray( features, *feat, CV_WHOLE_SEQ );for( i = 0; i < n; i++ ){free( (*feat)[i].feature_data );(*feat)[i].feature_data = NULL;}cvReleaseMemStorage( &storage );cvReleaseImage( &init_img );release_pyr( &gauss_pyr, octvs, intvls + 3 );release_pyr( &dog_pyr, octvs, intvls + 2 );return n;
}

这个函数是上述函数一的重载,作用是一样的,实际上函数一只不过是使用默认参数调用了函数二,
核心的代码都是在函数二中实现的。


sift创始人David Lowe的完整代码,包括他的论文,请到此处下载:
http://www.cs.ubc.ca/~lowe/keypoints
日后,本BLOG内,会具体剖析下上述David Lowe的Sift算法代码。

Rob Hess维护的sift 库:
http://blogs.oregonstate.edu/hess/code/sift/
还可,参考这里:
sift图像特征提取与匹配算法代码(友人,onezeros博客):
http://blog.csdn.net/onezeros/archive/2011/01/05/6117704.aspx

完。July、二零一一年二月十五日。


http://chatgpt.dhexx.cn/article/x09KrhHo.shtml

相关文章

SIFT算法原理详解

通过《图像局部不变性特征与描述》学习SIFT&#xff0c;遇到各种Issue&#xff0c;总结了这篇博客和另外九篇博客。感谢关注&#xff0c;希望可以互相学习&#xff0c;不断提升。转载请注明链接&#xff1a;https://www.cnblogs.com/Alliswell-WP/p/SIFT.html 如果想深入研究SI…

SIFT算法详解与代码解析

Sift算法详解及代码解析 学了SIFT也有1个半月了&#xff0c;真的是坎坷不断&#xff0c;也因为我可能接触图像邻域时间不长&#xff0c;有很多相关知识要学习&#xff0c;直至今日&#xff0c;才把SIFT大致弄明白。但还有些细节值得去深究&#xff0c;我先把我个人对SIFT算法的…

图像处理——SIFT算法

[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints) SIFT算法&#xff08;Scale-invariant feature transform&#xff09;&#xff0c;即尺度不变特征变换&#xff0c;由David Lowe提出&#xff0c;是一种基于局部兴趣点的算法&#xff0c;因此不仅对…

特征点匹配——SIFT算法详解

之前在学习三维重建的过程中&#xff0c;了解过SIFT算法&#xff0c;现在老师要求详细的了解SIFT算法&#xff0c;看看能不能对它进行改进&#xff0c;于是又详细的看了一遍SIFT算法。记录一下。 一、SIFT算法综述 SIFT&#xff08;Scale Invariant Feature Transform&#x…

SIFT算法之python实现

0. 算法原理细节可参考&#xff1a; https://blog.csdn.net/abcjennifer/article/details/7639681https://blog.csdn.net/zddblog/article/details/7521424?depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_sourcedistribute.pc_re…

Python实现SIFT算法,附详细公式推导和代码

SIFT特征点提取算法 1、算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征&#xff0c;它在空间尺度中寻找极值点&#xff0c;并提取出其位置、尺度、旋转不变量&#xff0c;此算法由 David …

图像特征匹配方法——SIFT算法原理及实现

传统图像处理中图像特征匹配有三个基本步骤&#xff1a;特征提取、特征描述和特征匹配。特征提取就是从图像中提取出关键点&#xff08;或特征点、角点&#xff09;等。特征描述就是用一组数学向量对特征点进行描述&#xff0c;其主要保证不同的向量和不同的特征点之间是一种对…

SIFT算法原理介绍

本文转自&#xff1a;https://blog.csdn.net/qq_37374643/article/details/88606351 SIFT算法 SIFT即尺度不变特征变换&#xff0c;是用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可在图像中检测出关键点&#xff0c;是一种局部特征描述子。 一、SIFT算…

SIFT算法的个人理解

SIFT算法的个人理解——理论篇 1. 前言 本人目前共使用过两个版本的sift算法: &#xff08;1&#xff09;Matlab中的sift算法&#xff0c;可以从http://www.cs.ubc.ca/~lowe/keypoints/下载Lowe团队写的sift演示代码&#xff1b; &#xff08;2&#xff09;opencv中的sift…

SIFT算法原理解析

首先找到图像中的一些“稳定点”&#xff0c;这些点是一些十分突出的点不会因光照条件的改变而消失&#xff0c;比如角点、边缘点、暗区域的亮点以及亮区域的点&#xff0c;既然两幅图像中有相同的景物&#xff0c;那么使用某种方法分别提取各自的稳定点&#xff0c;这些点之间…

SIFT算法步骤梳理

简介&#xff1a;SIFT算法是检测和描述局部特征的一种方法&#xff0c;具有尺度不变性&#xff0c;对于光线&#xff0c;噪声等的容忍度相当高。即便少数几个物体也可以产生大量SIFT特征。 SIFT算法实质上是在不同尺度空间上查找关键点&#xff0c;并计算出关键点的方向。 算…

SIFT算法原理详解及代码实现(笔记)

一、SIFT算法概述&#xff1a; SIFT&#xff08;Scale Invariant Feature Transform&#xff09;全称尺度不变特征变换&#xff0c;SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述&#xff0c;因此一幅图像经过SIFT算法后表示为一个128维的特征向量集&#xf…

SIFT算法 特征匹配

目录 一、SIFT算法DOG尺度空间构造&#xff08;Difference of Gaussian&#xff09;关键点搜索与定位方向赋值、关键点描述 二、特征匹配 一、SIFT算法 参考链接 【OpenCV】SIFT原理与源码分析 DOG尺度空间构造&#xff08;Difference of Gaussian&#xff09; 首先是对原特…

SIFT算法详解——图像特征提取与匹配

文章目录 前言一、建立高斯差分金字塔1、建立高斯金字塔2、建立高斯差分金字塔3、建塔过程中参数的设定及相关细节问题 二、关键点(key points)位置确定1、阈值化2、在高斯差分金字塔中找极值点3、调整极值点位置4、舍去低对比度的点5、边缘效应的去除&#xff08;难点&#xf…

非常详细的sift算法原理解析

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自&#xff1a;http://blog.csdn.net/zddblog/article/details/7521424 对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟&#xff0c;本文帮你跨越。 1、SIFT综…

【Python】:SIFT算法的实现

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…

SIFT算法原理

SIFT算法 SIFT即尺度不变特征变换&#xff0c;是用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可在图像中检测出关键点&#xff0c;是一种局部特征描述子。 一、SIFT算法特点&#xff1a; 1、具有较好的稳定性和不变性&#xff0c;能够适应旋转、尺度缩放…

计算机视觉——SIFT算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SIFT算法特点二、SIFT算法实质三、SIFT算法实现特征匹配主要有以下流程&#xff1a;1、**特征点位置和尺度的提取**&#xff1a;2、**特征点方向的提取**3、…

SIFT(尺度不变特征变换)算法

目录 SIFT 1、生成高斯差分金字塔&#xff0c;尺度空间构建 2、空间极值点检测 3、稳定关键点的精确定位 4、稳定关键点方向信息分配 5、关键点描述 6、特征点匹配 SIFT SIFT&#xff1a;Scale-Invariant Feature Trainsform即尺度不变特征变换&#xff0c;这是一种图像…

SIFT算法

1. SIFT简介 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征&#xff0c;它在空间尺度中寻找极值点&#xff0c;并提取出其位置、尺度、旋转不变量&#xff0c;此算法由 David Lowe在1999年所发表&#xff…