SIFT算法分析.docx
- 文档编号:14692854
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:18
- 大小:358.78KB
SIFT算法分析.docx
《SIFT算法分析.docx》由会员分享,可在线阅读,更多相关《SIFT算法分析.docx(18页珍藏版)》请在冰点文库上搜索。
SIFT算法分析
SIFT算法分析
1SIFT主要思想
SIFT算法就是一种提取局部特征得算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量。
2SIFT算法得主要特点:
a)SIFT特征就是图像得局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度得稳定性。
b)独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确得匹配.
c) 多量性,即使少数得几个物体也可以产生大量SIFT特征向量。
d)高速性,经优化得SIFT匹配算法甚至可以达到实时得要求。
e)可扩展性,可以很方便得与其她形式得特征向量进行联合。
3SIFT算法流程图:
4 SIFT算法详细
1)尺度空间得生成
尺度空间理论目得就是模拟图像数据得多尺度特征.
高斯卷积核就是实现尺度变换得唯一线性核,于就是一副二维图像得尺度空间定义为:
其中就是尺度可变高斯函数,
(x,y)就是空间坐标,就是尺度坐标.大小决定图像得平滑程度,大尺度对应图像得概貌特征,小尺度对应图像得细节特征。
大得值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。
为了有效得在尺度空间检测到稳定得关键点,提出了高斯差分尺度空间(DOGscale-space).利用不同尺度得高斯差分核与图像卷积生成。
DOG算子计算简单,就是尺度归一化得LoG算子得近似。
图像金字塔得构建:
图像金字塔共O组,每组有S层,下一组得图像由上一组图像降采样得到。
图1由两组高斯尺度空间图像示例金字塔得构建,第二组得第一副图像由第一组得第一副到最后一副图像由一个因子2降采样得到。
图2DoG算子得构建:
图1Twooctaves ofaGaussianscale-spaceimagepyramid withs=2intervals、Thefirst imageinthesecondoctave iscreatedbydownsamplingtolast imageintheprevious
图2Thedifferenceoftwoadjacentintervalsin theGaussianscale—spacepyramid createaninterval inthedifference—of-Gaussianpyramid(shownin green)、
2)空间极值点检测
为了寻找尺度空间得极值点,每一个采样点要与它所有得相邻点比较,瞧其就是否比它得图像域与尺度域得相邻点大或者小.如图3所示,中间得检测点与它同尺度得8个相邻点与上下相邻尺度对应得9×2个点共26个点比较,以确保在尺度空间与二维图像空间都检测到极值点.一个点如果在DOG尺度空间本层以及上下两层得26个领域中就是最大或最小值时,就认为该点就是图像在该尺度下得一个特征点,如图1所示.
图3DoG尺度空间局部极值检测
3)构建尺度空间需确定得参数
—尺度空间坐标
O-octave坐标
S-sub—level坐标
与O、S得关系,
其中就是基准层尺度。
o-octave坐标,s-sub-level坐标。
注:
octaves得索引可能就是负得。
第一组索引常常设为0或者-1,当设为-1得时候,图像在计算高斯尺度空间前先扩大一倍。
空间坐标x就是组octave得函数,设就是0组得空间坐标,则
如果就是基础组o=0得分辨率,则其她组得分辨率由下式获得:
注:
在Lowe得文章中,Lowe使用了如下得参数:
在组o=-1,图像用双线性插值扩大一倍(对于扩大得图像)。
4)精确确定极值点位置
通过拟与三维二次函数以精确确定关键点得位置与尺度(达到亚像素精度),同时去除低对比度得关键点与不稳定得边缘响应点(因为DoG算子会产生较强得边缘响应),以增强匹配稳定性、提高抗噪声能力.
①空间尺度函数
)泰勒展开式如下:
对上式求导,并令其为0,得到精确得位置,
②在已经检测到得特征点中,要去掉低对比度得特征点与不稳定得边缘响应点。
去除低对比度得点:
把公式(4)代入公式(3),只取前两项可得:
若,该特征点就保留下来,否则丢弃。
③边缘响应得去除
一个定义不好得高斯差分算子得极值在横跨边缘得地方有较大得主曲率,而在垂直边缘得方向有较小得主曲率。
主曲率通过一个2x2得Hessian矩阵H求出:
导数由采样点相邻差估计得到。
D得主曲率与H得特征值成正比,令为最大特征值,为最小得特征值,则
令,则:
(r +1)2/r得值在两个特征值相等得时候最小,随着r得增大而增大,因此,为了检测主曲率就是否在某域值r下,只需检测
在Lowe得文章中,取r=10。
5)关键点方向分配
利用关键点邻域像素得梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。
式(5)为(x,y)处梯度得模值与方向公式。
其中L所用得尺度为每个关键点各自所在得尺度.
在实际计算时,我们在以关键点为中心得邻域窗口内采样,并用直方图统计邻域像素得梯度方向。
梯度直方图得范围就是0~360度,其中每10度一个柱,总共36个柱。
直方图得峰值则代表了该关键点处邻域梯度得主方向,即作为该关键点得方向。
图4就是采用7个柱时使用梯度直方图为关键点确定主方向得示例。
(窗口尺寸采用Lowe推荐得1、5σ×1、5σ)
图4由梯度方向直方图确定主梯度方向
在梯度方向直方图中,当存在另一个相当于主峰值80%能量得峰值时,则将这个方向认为就是该关键点得辅方向。
一个关键点可能会被指定具有多个方向(一个主方向,一个以上辅方向),这可以增强匹配得鲁棒性[53].
至此,图像得关键点已检测完毕,每个关键点有三个信息:
位置、所处尺度、方向.由此可以确定一个SIFT特征区域(在实验章节用椭圆或箭头表示)。
6)特征点描述子生成
首先将坐标轴旋转为关键点得方向,以确保旋转不变性.
图5由关键点邻域梯度信息生成特征向量
接下来以关键点为中心取8×8得窗口。
图5—4左部分得中央黑点为当前关键点得位置,每个小格代表关键点邻域所在尺度空间(与关键点就是否为一个尺度空间)得一个像素,利用公式(5)求得每个像素得梯度幅值与梯度方向,箭头方向代表该像素得梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算,每个像素对应一个向量,长度为,为该像素点得高斯权值,方向为,图中蓝色得圈代表高斯加权得范围(越靠近关键点得像素梯度方向信息贡献越大)。
高斯参数σ′取3倍特征点所在得尺度。
然后在每4×4得小块上计算8个方向得梯度方向直方图,绘制每个梯度方向得累加值,即可形成一个种子点,如图5右部分所示。
此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息.这种邻域方向性信息联合得思想增强了算法抗噪声得能力,同时对于含有定位误差得特征匹配也提供了较好得容错性。
实际计算过程中,为了增强匹配得稳健性,对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维得SIFT特征向量。
此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素得影响,再继续将特征向量得长度归一化,则可以进一步去除光照变化得影响。
当两幅图像得SIFT特征向量生成后,下一步我们采用关键点特征向量得欧式距离来作为两幅图像中关键点得相似性判定度量。
取图像1中得某个关键点,并找出其与图像2中欧式距离最近得前两个关键点,在这两个关键点中,如果最近得距离除以次近得距离少于某个比例阈值,则接受这一对匹配点。
降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定.为了排除因为图像遮挡与背景混乱而产生得无匹配关系得关键点,用比较最近邻距离与次近邻距离得方法,距离比率ratio小于某个阈值得认为就是正确匹配。
因为对于错误匹配,由于特征空间得高维性,相似得距离可能有大量其她得错误匹配,从而它得ratio值比较高。
推荐ratio得阈值为0、8.
5 仿真结果分析
将文件加入matlab目录后,在主程序中有两种操作:
op1:
寻找图像中得Sift特征:
[image,discrips,locs]=sift('scene、pgm');
Findingkeypoints、、、
1021 keypointsfound、
〉〉showkeys(image,locs);
DrawingSIFTkeypoints、、、
op2:
对两幅图中得SIFT特征进行匹配:
match('scene、pgm’,'book、pgm');
Findingkeypoints、、、
1021 keypointsfound、
Findingkeypoints、、、
882 keypointsfound、
Found98matches、
6 代码
1)appendimages、m
%im= appendimages(image1,image2)
%
%Returnanewimagethatappendsthetwoimages side-by-side、
functionim =appendimages(image1, image2)
%Select theimagewiththefewest rowsand fillinenoughemptyrows
% tomakeitthe sameheightastheotherimage、
rows1 =size(image1,1);
rows2=size(image2,1);
if (rows1〈rows2)
image1(rows2,1)=0;
else
image2(rows1,1)=0;
end
%Now appendbothimagesside-by-side、
im=[image1 image2];
2)match、m
%num = match(image1,image2)
%
%Thisfunctionreadstwo images, findstheirSIFTfeatures,and
% displayslinesconnecting thematchedkeypoints、 Amatchisaccepted
% onlyif itsdistanceis lessthandistRatiotimesthedistance tothe
%secondclosestmatch、
% Itreturns thenumberofmatches displayed、
%
% Example:
match('scene、pgm’,'book、pgm’);
functionnum=match(image1, image2)
% Find SIFT keypointsforeach image
[im1,des1,loc1]=sift(image1);
[im2,des2,loc2]=sift(image2);
%Forefficiency inMatlab, it is cheapertoputedotproductsbetween
%unitvectorsratherthanEuclideandistances、Note thattheratioof
%angles (acosofdotproducts ofunitvectors)is acloseapproximation
% totheratioofEuclideandistancesforsmall angles、
%
%distRatio:
Onlykeepmatchesinwhichtheratioofvectoranglesfrom the
% nearest tosecondnearestneighboris less thandistRatio、
distRatio=0、6;
% Foreach descriptor inthe firstimage, selectitsmatchtosecond image、
des2t=des2’; %Preputematrixtranspose
fori=1:
size(des1,1)
dotprods=des1(i,:
)*des2t; %putesvector ofdotproducts
[vals,indx]=sort(acos(dotprods)); % Takeinverse cosineand sortresults
% Check if nearestneighborhas angle lessthandistRatiotimes2nd、
if(vals(1)〈distRatio*vals
(2))
match(i) =indx
(1);
else
match(i)=0;
end
end
%Create anewimageshowingthe two imagessideby side、
im3=appendimages(im1,im2);
%Showa figurewithlines joining theaccepted matches、
figure(’Position', [100100 size(im3,2)size(im3,1)]);
colormap('gray');
imagesc(im3);
holdon;
cols1= size(im1,2);
fori= 1:
size(des1,1)
if(match(i)> 0)
line([loc1(i,2) loc2(match(i),2)+cols1], 、、、
[loc1(i,1) loc2(match(i),1)],’Color','c');
end
end
hold off;
num =sum(match〉0);
fprintf('Found%dmatches、\n’,num);
3)showkeys、m
% showkeys(image,locs)
%
%Thisfunctiondisplaysan imagewith SIFTkeypointsoverlayed、
%Input parameters:
%image:
thefortheimage(grayscale)
% locs:
matrixinwhicheachrow gives akeypointlocation(row,
% column, scale, orientation)
functionshowkeys(image, locs)
disp('DrawingSIFTkeypoints、、、');
% Drawimage with keypoints
figure('Position’,[5050 size(image,2) size(image,1)]);
colormap('gray');
imagesc(image);
holdon;
imsize= size(image);
fori =1:
size(locs,1)
%Drawanarrow,each linetransformed accordingtokeypointparameters、
TransformLine(imsize,locs(i,:
),0、0,0、0,1、0,0、0);
TransformLine(imsize, locs(i,:
),0、85,0、1,1、0,0、0);
TransformLine(imsize, locs(i,:
),0、85,—0、1,1、0, 0、0);
end
hold off;
%-—---- Subroutine:
TransformLine—-—-—-—
%Draw thegivenlineintheimage,butfirst translate,rotate, and
%scale accordingtothekeypointparameters、
%
%Parameters:
%Arrays:
%imsize = [rowscolumns]ofimage
%keypoint= [subpixel_row subpixel_columnscaleorientation]
%
%Scalars:
% x1, y1; beginingofvector
% x2,y2; endingofvector
function TransformLine(imsize, keypoint,x1, y1, x2, y2)
%Thescalingofthe unitlengtharrow is settoapproximatelytheradius
%of theregionused toputethe keypointdescriptor、
len= 6* keypoint(3);
%Rotate the keypointsby'ori' =keypoint(4)
s= sin(keypoint(4));
c= cos(keypoint(4));
%Apply transform
r1= keypoint
(1)- len *(c*y1+s*x1);
c1=keypoint
(2) +len *(-s*y1 +c*x1);
r2= keypoint(1)-len*(c*y2+ s*x2);
c2=keypoint(2)+len*(— s* y2 +c*x2);
line([c1c2],[r1 r2],’Color’, ’c');
4)sift、m
%[image,descriptors,locs]=sift(imageFile)
%Thisfunctionreadsan imageandreturnsitsSIFT keypoints、
%Inputparameters:
%imageFile:
theforthe image、
%
%Returned:
% image:
theimage array indoubleformat
% descriptors:
a K-by-128 matrix,whereeachrow givesan invariant
% descriptorforoneoftheK keypoints、 The descriptor is a vector
% of128 valuesnormalizedtounitlength、
%locs:
K-by-4matrix,inwhicheachrow hasthe 4valuesfor a
%keypointlocation(row, column,scale, orientation)、The
% orientationisintherange [-PI, PI]radians、
%
%Credits:
Thanks forinitialversionof thisprogramtoD、Alvaro and
% J、J、Guerrero,Universidad deZaragoza (modified byD、Lowe)
function[image,descriptors,locs]=sift(imageFile)
%Loadimage
image= imread(imageFile);
%IfyouhavetheImageProcessingToolbox, youcanunment thefollowing
% linestoallowinput ofcolorimages, whichwillbeconvertedto grayscale、
% ifisrgb(image)
%image= rgb2gray(image);
% end
[rows,cols]=size(image);
%Convertinto PGMimagefile,readableby"keypoints"executable
f = fopen('tmp、pgm', 'w');
iff== -1
error('Couldnotcreate、’);
end
fprintf(f,’P5\n%d\n%d\n255\n',cols, rows);
fwrite(f,image’,’uint8');
fclose(f);
%Callkeypointsexecutable
ifisunix
mand='!
、/sift';
else
mand ='!
siftWin32';
end
mand=[mand ' 〈tmp、pgm>tmp、key’];
eval(mand);
%Opentmp、keyandcheckits header
g=fopen('tmp、key',’r');
ifg==—1
error('Couldnot open、’);
end
[header, count] =fscanf(g, '%d %d',[12]);
ifcount~=2
error('Invalidkeypoint 、’);
end
num= header
(1);
len =header
(2);
iflen~=128
error(’Keypoint descriptorlength invalid(shouldbe128)、’);
end
%Createsthetwooutputmatrices(useknownsizeforefficiency)
locs= double(zeros(num,4));
descriptors=double(zeros(num,128));
%Parsetmp、key
fori=1:
num
[vector,count] =fscanf(g, ’%f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SIFT 算法 分析
![提示](https://static.bingdoc.com/images/bang_tan.gif)