SIFT算法学习小记

来源:互联网 发布:vue.js最新版本 编辑:程序博客网 时间:2024/05/21 04:18

SIFT算法学习小记
http://www.cnblogs.com/saintbird/archive/2008/08/20/1271943.html

    Sift是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。在Mikolajczyk对包括Sift算子在内的十种局部描述子所做的不变性对比实验中,Sift及其扩展算法已被证实在同类描述子中具有最强的健壮性。

 

    总体来说,Sift算子具有以下特性:

   (1)Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。

   (2)独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。

   (3)多量性,即使少数的几个物体也可以产生大量Sift特征向量。

   (4)速度相对较快,经优化的Sift匹配算法甚至可以达到实时的要求。

   (5)可扩展性强,可以很方便的与其他形式的特征向量进行联合。

 

     Sift特征匹配算法主要包括两个阶段,一个是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量;第二阶段是Sift特征向量的匹配。

     Sift特征的生成一般包括以下几个步骤:

     1、构建尺度空间,检测极值点,获得尺度不变性;

                  

     2、特征点过滤并进行精确定位;

                  

     3、为特征点分配方向值;

                 

     4、生成特征描述子。 

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

                 

 

    当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。

    一些Sift特征匹配的例子:

 

 

         

 

           

 


 

 

 

分类: 图像工程
标签: 图像处理, SIFT, 特征匹配, 模式识别
绿色通道:好文要顶关注我收藏该文与我联系
saintbird
关注 - 0
粉丝 - 3
+加关注
0
0
(请您对文章做出评价)
« 上一篇:原来JS是如此强悍
» 下一篇:常用图像空域滤波技术
posted on 2008-08-20 11:06 saintbird 阅读(12406) 评论(51) 编辑 收藏
 
FeedBack:
#1楼
2008-08-20 11:12 | gaga[未注册用户]
真牛!应用到图片识别上,效率可以提高很多
 回复 引用   
#2楼[楼主]
2008-08-20 11:17 | saintbird      
@gaga
Sift算法本身就是一种模式识别技术,目前是国内外研究的热点。

 回复 引用 查看   
#3楼
2008-09-17 16:03 | 游客[未注册用户]
请问有没有源程序啊?
 回复 引用   
#4楼[楼主]
2008-09-18 10:49 | saintbird      
不好意思,源代码暂时不方便发布。
 回复 引用 查看   
#5楼
2008-10-16 11:21 | cjjwjb[未注册用户]
你好,能不能就计算一个点的sift特征向量这个代码分享一下哟,我刚开始学,不太懂,非常感谢!或者发我邮箱也行,jianjuanc@gmail.com
 回复 引用   
#6楼
2008-10-26 19:34 | 帝国[未注册用户]
终于找到一个有共同兴趣的讨论sift. 
我正在用此算法。遇到了一些问题。希望能和你探讨。 
1。 如何实现自动尺度选择(automatic scale 
selection)? 
我用尺度不变特性转化(scale invariant feature transform)算法的关键点定位,在对应不同的尺度的高斯图像上找到了不同数目的关键点,但我不知道什么标准确定哪一个尺度更适合尺度的空间表示(scale representation). 
如果可能,请给我回信.

 回复 引用   
#7楼[楼主]
2008-10-27 16:31 | saintbird      
@cjjwjb
不好意思,最近事情较多,一直没上博客,之后我会写一篇文章介绍Sift算法常用函数的使用,希望能对你有用。

 回复 引用 查看   
#8楼[楼主]
2008-10-27 17:08 | saintbird      
@帝国
不是很明白你的意思,如果是指关键点精确定位的话,是通过DoG函数的二阶Taylor展开式获取特征点的亚像素精确插值估计,然后设定一个阙值进行过滤,这在David Lowe的论文里有比较详细的描述。

 回复 引用 查看   
#9楼
2008-10-27 18:57 | 帝国[未注册用户]
@saintbird
帮忙看一下,关键点定位的部分哪里有问题吗?
[sx,sy]=size(image);

for i=2:sx-1,
for j=2:sy-1,
for n=2:count-2,
neigh=vol0(i-1:i+1,j-1:j+1,n-1:n+1); % (look for maximum or minmum in 26 neighbour points)
minval=min(min(min(neigh)));
maxval=max(max(max(neigh)));
if vol0(i,j,n)==minval 
res0{n}(i,j)=1;
end;
if vol0(i,j,n)==maxval
res0{n}(i,j)=1;
end;

[rows,cols]=find( res0{n});% (remove keypoints with low contrast and unstable edge)
for jj=1:length(rows)
r = rows(jj);
c = cols(jj);
D_xx = dog{n}(r,c-1) - 2*dog{n}(r,c) + dog{n}(r,c+1);
D_yy = dog{n}(r-1,c) - 2*dog{n}(r,c) + dog{n}(r+1,c);
D_xy = dog{n}(r,c-1) - dog{n}(r,c) -dog{n}(r-1,c-1) + dog{n}(r-1,c);
D_x=dog{n}(r,c-1)-dog{n}(r,c);
D_y=dog{n}(r-1,c)- dog{n}(r,c);
D_I=dog{n-1}(r,c)-dog{n}(r,c);
D_II=dog{n-1}(r,c)-2*dog{n}(r,c)+dog{n+1}(r,c);
D_xI=dog{n-1}(r,c-1)-dog{n-1}(r,c)-dog{n}(r,c-1)+dog{n}(r,c);
D_yI=dog{n-1}(r-1,c)-dog{n-1}(r,c)-dog{n}(r-1,c)+dog{n}(r,c);

trH = D_xx + D_yy;
detH = D_xx*D_yy - D_xy^2;
Xmax=-inv([D_xx,D_xy,D_xI;D_xy,D_yy,D_yI;D_xI,D_yI, D_II])*[D_x;D_y;D_I]; % (location of keypoint)
for w=1:3
if Xmax(w)>0.5
Xmax(w)=ceil(Xmax(w)); % (interpolate a new value in any direction of location of keyponints)
end
end
Dmax=0.5*[D_xx D_xy D_xI; D_xy D_yy D_yI;D_xI D_yI D_II]'*Xmax+dog{n}(r,c); % (remove keypoints with low contast )
if (trH^2 / detH) > cr | abs(Dmax)<0.03
res0{n}(r,c) = 0; 
end;
end;
end
end
end

 回复 引用   
#10楼[楼主]
2008-10-28 09:34 | saintbird      
@帝国
没有调试环境,直接看你上面的代码很难发现问题。关键点定位Lowe已经给出了实现了代码,你可以直接使用的。

 回复 引用 查看   
#11楼
2008-10-28 16:44 | 帝国[未注册用户]
@saintbird

你说关键点定位Lowe已经给出了实现的代码, 我没有找到,你可以把它传给我吗?谢谢。

 回复 引用   
#12楼[楼主]
2008-10-29 17:20 | saintbird      
@帝国
看看这个函数是不是你需要的.

/*
Interpolates a scale-space extremum's location and scale to subpixel
accuracy to form an image feature. Rejects features with low contrast.
Based on Section 4 of Lowe's paper. 

@param dog_pyr DoG scale space pyramid
@param octv feature's octave of scale space
@param intvl feature's within-octave interval
@param r feature's image row
@param c feature's image column
@param intvls total intervals per octave
@param contr_thr threshold on feature contrast

@return Returns the feature resulting from interpolation of the given
parameters or NULL if the given location could not be interpolated or
if contrast at the interpolated loation was too low. If a feature is
returned, its scale, orientation, and descriptor are yet to be determined.
*/
struct feature* interp_extremum( IplImage*** dog_pyr, int octv, int intvl,
int r, int c, int intvls, double contr_thr )
{
struct feature* feat;
struct detection_data* ddata;
double xi, xr, xc, contr;
int i = 0;

while( i < SIFT_MAX_INTERP_STEPS )
{
interp_step( dog_pyr, octv, intvl, r, c, &xi, &xr, &xc );
if( ABS( xi ) < 0.5 && ABS( xr ) < 0.5 && ABS( xc ) < 0.5 )
break;

//TODO:Nic:[070508-Anno1]
/* In libSift, the below condition is added when either xi or xr or xc is >0.5:
* if (xr * xr + xc * xc > 2.0) return NULL;
*/
c += cvRound( xc );
r += cvRound( xr );
intvl += cvRound( xi );//TODO:Nic:[070508-Anno2]In libSift, a peak is rejected if xi>scaleAdjustThresh

if( intvl < 1 ||
intvl > intvls ||
c < SIFT_IMG_BORDER ||
r < SIFT_IMG_BORDER ||
c >= dog_pyr[octv][0]->width - SIFT_IMG_BORDER ||
r >= dog_pyr[octv][0]->height - SIFT_IMG_BORDER )
{
return NULL;
}

i++;
}

/* ensure convergence of interpolation */
if( i >= SIFT_MAX_INTERP_STEPS )
return NULL;

contr = interp_contr( dog_pyr, octv, intvl, r, c, xi, xr, xc );
//TODO:Nic:[070508-Anno4]In libSift, it's like this: [ABS( contr ) < contr_thr]
if( ABS( contr ) < contr_thr / intvls )
return NULL;

//TODO:Nic:[070508-Anno3]
/*
* Since the new peak may shift between coords and level several times, so it may resemble some next peak
* and here it doesn't prevent this case.
*/
feat = new_feature();
ddata = feat_detection_data( feat );
//TODO:Nic:[070508-Anno7]
/*
* feat->x,y,img_pt are converted to sub-pixel & values are relative to 2*original image!
*/
feat->img_pt.x = feat->x = ( c + xc ) * pow( 2.0, octv );
feat->img_pt.y = feat->y = ( r + xr ) * pow( 2.0, octv );
//TODO:Nic:[070508-Anno7]
/*
* r,c are not added with xr,xc, yet major changes(xr or xc>0.5) may have already been made to either or both!
*/
ddata->r = r;
ddata->c = c;
ddata->octv = octv;
//TODO:Nic:[070508-Anno7]
/*
* intvl is not added with xi, yet major changes(xi>0.5) may have already been made to intvl!
*/
ddata->intvl = intvl;
ddata->subintvl = xi;

return feat;
}

 回复 引用 查看   
#13楼
2008-10-30 18:52 | 帝国[未注册用户]
谢谢你的帮助,我正在尝试作。有什么需要的英文文章, 我可以给你传过去。
Once a complete octave has been
processed, we resample the Gaussian image that has twice the initial value of sigma (it will be 2 images from the top of the stack) by taking every second pixel in each row and column.
我不清楚以上句子的意思。 resize the image (row/2, col/2), 
sigma1= 2*sigma (in the new octave)
如何把不同 octave联系起来。 我目前只在一个 octave操作来寻找关键点。

 回复 引用   
#14楼
2008-10-30 22:51 | 帝国[未注册用户]
xr, xc, xi 是采样点的偏离,计算的结果假设对应 18.4223, -25.9483 和-13.1159, 根据原作者在任一方向偏离大于0.5,意味着极值点根接近另一采样点,那么xr, xc, xi 变成1,-1,-1? 

contr 是极值点位置的值, 如果其小于某个阀值,说明这个点不稳定, 抹掉。我得到的结果它是1 by 3 矩阵。应该只是一个数吧?
请指教。

 回复 引用   
#15楼[楼主]
2008-11-01 12:32 | saintbird      
@帝国
resize是一个下采样的过程,octave就是这样建立起来的。

 回复 引用 查看   
#16楼
2008-11-01 16:07 | 帝国[未注册用户]
如何把不同 octave联系起来,octave它有什么作用?
 回复 引用   
#17楼
2008-11-02 19:09 | 帝国[未注册用户]
你怎么理解scale invariant feature?
它是否意味着,改变scale,梯度(gradient)将不受影响, 那么边缘等特征点在不同的尺度下被找到同样数目。
我很迷惑。

 回复 引用   
#18楼[楼主]
2008-11-03 12:08 | saintbird      
@帝国
基本上可以这样理解,无论你的scale如何变化,极值点的相对关系是不会发生改变的。

 回复 引用 查看   
#19楼
2008-11-11 17:12 | 啊[未注册用户]
一看就是R H的代码,做学问的都是坑人的。。。 

国内基本都不好好做学问。

 回复 引用   
#20楼[楼主]
2008-11-12 13:41 | saintbird      
@啊
现在国内做学问的人确实比较浮躁,不过坑人似乎就无从说起了吧。而且学习Sift完全称不上做学问,只是在学习一种图像算法而已,跟其他程序算法没本质区别。

 回复 引用 查看   
#21楼
2008-11-14 21:38 | 帝国[未注册用户]
我正在写医疗图像加强的硕士论文。人在迷茫的时候,需要有人指点方向。我用了几个寻找极点方法的比较。多谢了。

中国人多,自然良莠不齐,不能一概而论。在我身边,许多优秀的中国研究人员,忘我的工作,踏踏实实的迈出人生的每一步。希望我们的研究力量更强,国更强。

 回复 引用   
#22楼[楼主]
2008-11-15 11:35 | saintbird      
@帝国
楼上那位兄弟有点小题大做了,坚持自己的梦想总是没错的,加油!

 回复 引用 查看   
#23楼
2009-01-07 23:31 | MickeyJ[未注册用户]
请问,我使用Lowe的代码在Matlab中匹配2张街景图片,有写地方不完全正确他也完全匹配起来,没有达到我需要正确的位置才能匹配的效果。 
附:2张图片,一张是行人拍摄的图片,一张是取自Googlemaps streetview的照片。象素不相同,大小也不同

 回复 引用   
#24楼[楼主]
2009-01-08 11:28 | saintbird      
@MickeyJ
首先SIFT不是万能的,其次匹配的效果与你设置的参数有关,如果方便的话可以把你的结果贴出来或发到我邮箱,我可以帮你看看。

 回复 引用 查看   
#25楼
2009-01-09 04:29 | MickeyJ[未注册用户]
谢谢楼主,我的Email你应该能看见,我不知道楼主信箱,QQ为84312081
 回复 引用   
#26楼[楼主]
2009-01-09 13:04 | saintbird      
@MickeyJ
我的邮箱:gu_mouse##163.com (##换为@)

 回复 引用 查看   
#27楼
2009-02-10 22:04 | jerald[未注册用户]
感谢楼主能及时回答我们的疑问,并给予帮助!我也想在这方面进行些交流.
 回复 引用   
#28楼
2009-02-11 09:29 | jerald[未注册用户]
关于SIFT,我有个比较大的疑惑: 

1. 首先个人感觉原文在确定尺度(或者说选取)上的表达有点问题。作者应该明确产生极大值的那一层高斯差分图对应的尺度便是 
所需的表达特征最为合适的尺度。这一点原文表达不明确。我找了半天,才勉强找到:在开始部分:At each candidate location, a detailed model is fit to determine location and scale. Keypoints are selected based on measures of their stability. 
以及原文3.1中的: It is selected only if it is larger than all of these neighbors or smaller than all of them. 
这种不清晰使得我一度以为尺度只是个参数,是人为设定的σ。其实那个基准层的基本尺度,才是人为设定的,作者取值为1.6。作者应该在不同含义的尺度上使用不同的数学符号表达。通篇文章使用的一个词:scale,以及一个数学符号, 
其实在不同的地方含义并不同。也不知当初审稿专家是怎么看的,他们没给搞混吗?还是我理解错了?就是一个意思?应该不都是一个意思吧,从其他人的理解以及各方面给出的SIFT介绍看。 

2. 关于特征描述子的表达。其使用128维向量的原因是由4×4阵列式的统计8个方向的直方图组成,而每个直方图相应的区域是4×4象素的窗口。这不意味着,不管目标特征的尺度如何,128维向量的相应区域是一样的,即16×16象素的窗口大小,这还能满足尺度不变的要求吗? 
比如某图中的目标物和另一图中只有一半大小的同样目标物,即尺度不同。两者采用同样大小的窗口作为某点的局部统计特征用,还能满足尺度不变的要求吗? 
从作者的实验看,尺寸小的目标,相应点的统计区域窗口要小些,这说明其与选取的尺度有关,这一点并未在原文中说明,我倒是看到其它介绍SIFT的材料有这样的说明,不知这样理解正确与否? 
我们假设尺寸大的目标的那个图像,在某点处,是在第二组octave的某尺度上形成极值,并假设此时的尺度为2σ,σ为当初人为设定的基准层基本尺度。则可以预计,理想情况下,尺寸小的同样目标的同样点会在第一组octave的某尺度形成极值,此时的尺度就是σ,这样才符合统计区域的窗口大小与尺度正比例关系(一些老外的教程就是这么说的),不知这样的理解正确与否? 
如果是正确的,作者并未在原文中交代。这可是严重的遗漏,因为这关系着描述子匹配的成败。 
还是这方面不需用作说明,因为显然如此? 

以上疑问楼主是怎么理解的,能给予点解释吗?我的理解正确吗?在此先谢谢你。

 回复 引用   
#29楼
2009-02-19 13:28 | 梅玲[未注册用户]
你好我毕业设计要做SIFT算法的内容,你能发一篇外文全文给我吗? 
与这个相关的,非常感谢~~~

 回复 引用   
#30楼
2009-02-19 13:50 | 梅玲[未注册用户]
@帝国 
我想要一篇关于这方面的一篇英文文章,能发给我吗?我的邮箱meilingrui861213@163.com 紧急需求,万分感谢!

 回复 引用   
#31楼[楼主]
2009-02-19 16:12 | saintbird      
@梅玲
已发。

 回复 引用 查看   
#32楼
2009-02-23 16:09 | seawater[未注册用户]
您好,我也希望能看一下这个方面的文献,请您发我邮箱吧:seawater2007@gmail.com 非常感谢!
 回复 引用   
#33楼
2009-03-12 16:26 | 伍慧[未注册用户]
您好,我也想要相关的英文文献,请您发我邮箱吧:381148wh@163.com 非常感谢! 

 回复 引用   
#34楼
2009-03-13 11:45 | 晓江[未注册用户]
您好!,我初次研究sift 算法,研究了一段时间后发现对高斯内核的生成理解有误,那位高手可以给我指点一下啊!
 回复 引用   
#35楼
2009-04-18 20:21 | steveYang[未注册用户]
同感,尺度不是一个容易理解的概念,我看了很久也还是很模糊,Lindeberg有一套尺度空间理论,无奈数学功底不好,很难读懂!我是看了Mikolajczyk的"Index based on scale invariant interest points"才对特征尺度的选择有了一定的理解。另外sift描述子中用的16*16窗口我也觉得没说清楚,我看有些程序的实现中,这个16*16是跟特征尺度有关的,根据特征尺度的大小做扩展,再重新采样插值得到的!怎么就没牛人将这个东西讲清楚!@jerald 

 回复 引用   
#36楼
2009-04-26 16:40 | chenxf[未注册用户]
不会吧大哥,你真逗,这都是David开源的,你还不方便公布?
 回复 引用   
#37楼[楼主]
2009-04-28 11:08 | saintbird      
@steveYang
尺度空间的概念可参考章毓晋的图像工程(上册),书里的解释比较容易理解。

 回复 引用 查看   
#38楼[楼主]
2009-04-28 11:12 | saintbird      
@chenxf
我上面已经提到David在自己的网站上给出了实现的代码,需要的朋友可以去自行下载,这个根本不需要我提供。不方便公布的是我们自行开发的程序,sift只是这其中的一部分,希望回复的朋友能认真看完所有的内容再做评论。

 回复 引用 查看   
#39楼
2009-05-06 23:47 | shelley
楼主您好,我现在在做关于三维图像匹配方面的课题,想了解一下关于sift算子的内容,我找到过david lowe教授的主页,也下载过他的两篇经典文章,但是没有找到他的开源代码,请问楼主可以指点一下关于C++算法的SIFT算子代码地址么?谢谢~!
 回复 引用   
#40楼[楼主]
2009-05-12 15:34 | saintbird      
@shelley
国外的网址忘记了,在pudn和csdn上都有下载的,搜索一下就出来了。

 回复 引用 查看   
#41楼
2009-06-10 12:32 | 丹丹1210[未注册用户]
能受累也给我发一下关于SIFT的英文文献吗?谢谢啦。dandan861210@sohu.com
 回复 引用   
#42楼
2009-07-02 17:21 | gucc[未注册用户]
你好,请问sift里面的octave和尺度如何理解
 回复 引用   
#43楼
2009-07-14 08:26 | lg123456lg[未注册用户]
两篇e文,我也看的不是很懂。有兴趣的加我qq一起讨论啊
qq:16182016

 回复 引用   
#44楼
2009-08-06 13:10 | 图像识别[未注册用户]
楼主、大家好,我们公司在广州,从事图像搜索技术研究,David Lowe是我们的技术顾问,指导我们把图像识别算法运用到商业,如果大家有兴趣的话可以给我邮件:awen01@126.com
 回复 引用   
#45楼[楼主]
2009-08-10 00:06 | saintbird      
@图像识别
如果真的请到了David Lowe,那你们公司的技术一定不会差了。

 回复 引用 查看   
#46楼
2009-10-21 10:57 | benzhang[未注册用户]
取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点.对不起,我不是太明白这句话什么意思。图像2中距离最近的两个关键点是哪两个关键点呢。
 回复 引用   
#47楼
2009-10-22 17:11 | dawn1125[未注册用户]
与46楼同疑问
 回复 引用   
#48楼[楼主]
2009-11-16 22:06 | saintbird      
@benzhang
欧式距离最小的2个点

 回复 引用 查看   
#49楼
2010-08-24 09:50 | pulord      
LZ我是新手..还望你指教..我想利用SIFT来实现两幅图的比较.主要是检测他们是否相似..这个想法可行么?如果不行..还希望LZ给偶一些建议 谢谢了
 回复 引用 查看   
#50楼
2011-03-22 09:32 | 婴鳞      
求问有详细的算法吗,我们做了两天解决了第一步卡在第二步了,求问如何特征点过滤并进行精确定位~~
 回复 引用 查看   
#51楼
2011-03-22 19:23 | wm1401      
靠,自己实现啊,牛人。

原创粉丝点击