sfit算法详解
sift特征提取分析
http://blog.csdn.net/abcjennifer/article/details/7639681/
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果,详细解析如下:
算法描述
SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。整个算法分为以下几个部分:
1. 构建尺度空间
这是一个初始化操作,高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间定义为:
其中 G(x,y,σ) 是尺度可变高斯函数
(x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。
下图所示不同σ下图像尺度空间:
关于尺度空间的理解说明:2kσ中的2是必须的,尺度空间是连续的。在 Lowe的论文中 ,将第0层的初始尺度定为1.6(最模糊),图片的初始尺度定为0.5(最清晰). 在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以 Lowe 建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。
图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)的图像,也成为子八度(octave),这是为了scale-invariant,也就是在任何尺度都能够有对应的特征点,第一个子八度的scale为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。
尺度空间的所有取值,i为octave的塔数(第几个塔),s为每塔层数
由图片size决定建几个塔,每塔几层图像(S一般为3-5层)。0塔的第0层是原始图像(或你double后的图像),往上每一层是对其下一层进行Laplacian变换(高斯卷积,其中σ值渐大,例如可以是σ, k*σ, k*k*σ…),直观上看来越往上图片越模糊。塔间的图片是降采样关系,例如1塔的第0层可以由0塔的第3层down sample得到,然后进行与0塔类似的高斯卷积操作。
2. LoG近似DoG找到关键点<检测DOG尺度空间极值点>
为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。
同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找
s=3的情况
使用Laplacian of Gaussian能够很好地找到找到图像中的兴趣点,但是需要大量的计算量,所以使用Difference of Gaussian图像的极大极小值近似寻找特征点.DOG算子计算简单,是尺度归一化的LoG算子的近似,有关DOG寻找特征点的介绍及方法详见http://blog.csdn.net/abcjennifer/article/details/7639488,极值点检测用的Non-Maximal Suppression。
3. 除去不好的特征点
这一步本质上要去掉DoG局部曲率非常不对称的像素。
通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,在这里使用近似Harris Corner检测器。
①空间尺度函数泰勒展开式如下:,对上式求导,并令其为0,得到精确的位置, 得
②在已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点。去除低对比度的点:把公式(2)代入公式(1),即在DoG Space的极值点处D(x)取值,只取前两项可得:
若 ,该特征点就保留下来,否则丢弃。
③边缘响应的去除
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2×2 的Hessian矩阵H求出:
导数由采样点相邻差估计得到。
D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,则
令α=γβ,则
(r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测
if (α+β)/ αβ> (r+1)2/r, throw it out. 在Lowe的文章中,取r=10。
4. 给特征点赋值一个128维方向参数
上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。
为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:
在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向。
直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向
由梯度方向直方图确定主梯度方向
该步中将建立所有scale中特征点的描述子(128维)
关键点描述子的生成步骤
5. 关键点描述子的生成
首先将坐标轴旋转为关键点的方向,以确保旋转不变性。以关键点为中心取8×8的窗口。
Figure.16*16的图中其中1/4的特征点梯度方向及scale,右图为其加权到8个主方向后的效果。
图左部分的中央为当前关键点的位置,每个小格代表关键点邻域所在尺度空间的一个像素,利用公式求得每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算。
图中蓝色的圈代表高斯加权的范围(越靠近关键点的像素梯度方向信息贡献越大)。然后在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。
在每个4*4的1/16象限中,通过加权梯度值加到直方图8个方向区间中的一个,计算出一个梯度方向直方图。
这样就可以对每个feature形成一个4*4*8=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation. 将这个向量归一化之后,就进一步去除了光照的影响。
5. 根据SIFT进行Match
生成了A、B两幅图的描述子,(分别是k1*128维和k2*128维),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。
实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT特征向量。此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。 当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力)作者建议ratio的取值原则如下:
ratio=0. 4 对于准确度要求高的匹配;
ratio=0. 6 对于匹配点数目要求比较多的匹配;
ratio=0. 5 一般情况下。
也可按如下原则:当最近邻距离<200时ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分错误匹配点。
当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。
实验结果:
Python+opencv实现:
import cv2 import numpy as np #import pdb #pdb.set_trace()#turn on the pdb prompt #read image img = cv2.imread('D:\privacy\picture\little girl.jpg',cv2.IMREAD_COLOR) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('origin',img); #SIFT detector = cv2.SIFT() keypoints = detector.detect(gray,None) img = cv2.drawKeypoints(gray,keypoints) #img = cv2.drawKeypoints(gray,keypoints,flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow('test',img); cv2.waitKey(0) cv2.destroyAllWindows()
C实现:
// FeatureDetector.cpp : Defines the entry point for the console application. // // Created by Rachel on 14-1-12. // Copyright (c) 2013年 ZJU. All rights reserved. // #include "stdafx.h" #include "highgui.h" #include "cv.h" #include "vector" #include "opencv\cxcore.hpp" #include "iostream" #include "opencv.hpp" #include "nonfree.hpp" #include "showhelper.h" using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //Load Image Mat c_src1 = imread( "..\\Images\\3.jpg"); Mat c_src2 = imread("..\\Images\\4.jpg"); Mat src1 = imread( "..\\Images\\3.jpg", CV_LOAD_IMAGE_GRAYSCALE); Mat src2 = imread( "..\\Images\\4.jpg", CV_LOAD_IMAGE_GRAYSCALE); if( !src1.data || !src2.data ) { std::cout<< " --(!) Error reading images " << std::endl; return -1; } //sift feature detect SiftFeatureDetector detector; std::vector<KeyPoint> kp1, kp2; detector.detect( src1, kp1 ); detector.detect( src2, kp2 ); SiftDescriptorExtractor extractor; Mat des1,des2;//descriptor extractor.compute(src1,kp1,des1); extractor.compute(src2,kp2,des2); Mat res1,res2; int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS; drawKeypoints(c_src1,kp1,res1,Scalar::all(-1),drawmode);//在内存中画出特征点 drawKeypoints(c_src2,kp2,res2,Scalar::all(-1),drawmode); cout<<"size of description of Img1: "<<kp1.size()<<endl; cout<<"size of description of Img2: "<<kp2.size()<<endl; //write the size of features on picture CvFont font; double hScale=1; double vScale=1; int lineWidth=2;// 相当于写字的线条 cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);//初始化字体,准备写到图片上的 // cvPoint 为起笔的x,y坐标 IplImage* transimg1 = cvCloneImage(&(IplImage) res1); IplImage* transimg2 = cvCloneImage(&(IplImage) res2); char str1[20],str2[20]; sprintf(str1,"%d",kp1.size()); sprintf(str2,"%d",kp2.size()); const char* str = str1; cvPutText(transimg1,str1,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符 str = str2; cvPutText(transimg2,str2,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符 //imshow("Description 1",res1); cvShowImage("descriptor1",transimg1); cvShowImage("descriptor2",transimg2); BFMatcher matcher(NORM_L2); vector<DMatch> matches; matcher.match(des1,des2,matches); Mat img_match; drawMatches(src1,kp1,src2,kp2,matches,img_match);//,Scalar::all(-1),Scalar::all(-1),vector<char>(),drawmode); cout<<"number of matched points: "<<matches.size()<<endl; imshow("matches",img_match); cvWaitKey(); cvDestroyAllWindows(); return 0; }
===============================
辅助资料:
===============================
Reference:
Lowe SIFT 原文:http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf
SIFT 的C实现:https://github.com/robwhess/opensift/blob/master/src
MATLAB 应用Sift算子的模式识别方法:http://blog.csdn.net/abcjennifer/article/details/7372880
http://blog.csdn.net/abcjennifer/article/details/7365882
http://en.wikipedia.org/wiki/Scale-invariant_feature_transform#David_Lowe.27s_method
http://blog.sciencenet.cn/blog-613779-475881.html
http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html
http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080951.html
http://blog.csdn.net/ijuliet/article/details/4640624
http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html (部分图片有误,以本文中的图片为准)
Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔
Sift之前的江湖
在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族。先来探究一下角点家族不为人知的恩怨情仇。
角点家族的族长是Moravec在1977年提出的Moravec角点检测算子,它是一种基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平、垂直方向上的灰度差异,以确定角点位置,Moravec是第一个角点检测算法,也是角点家族的开山鼻祖。
角点家族的九袋长老是Chris Harris & Mike Stephens在1988年提出的Harris角点检测算子。Harris不止是考察水平、垂直4个方向上的灰度差异,而是考察了所有方向上的灰度差异,并且具有旋转不变性和对部分仿射变换的稳定性。Harris是整个角点检测家族的颜值担当。
角点家族的大护法是J.Shi和C.Tomasi在1994年提出的Shi-Tomasi角点检测算子,它是对Harris角点算子的改进,并且有一个直接"叫嚣"Harris算子的名字——"Good Features to Track",在Opencv中实现函数是goodfeaturesToTrack。它通过考察自相关矩阵M的两个特征值中的较小者来确定就角点,大部分情况下,有比Harris更好的检测效果。
角点家族洪兴堂堂主是E.Rosten和T.Drummond在2006年提出的FAST(Feature from Accelerated Segment Test)算子。它通过考察像素点与其邻域内16个像素点的差异来确定特征点(角点),并且通过分割测试算法对检测效率做了极大的提升。它信奉"天下武功,唯快不破"的真理,在快的道路上锐意进取,基本可以满足实时检测系统的要求,在现今计算机视觉领域赚足了眼球。
角点家族这种群雄逐鹿的局面一直持续了很多年,大家你追我赶,在群主Moravec的带领下家族基于日渐殷实。直到20多年后的1999年的某天拂晓,一个叫Sift的后生叩响了角点家族的鎏金铁门。
Sift闪亮登场
1999年,大不列颠哥伦比亚大学的David G.Lowe教授在现有基于不变量技术的特征检测方法基础上,提出了一种基于尺度空间的,对图像缩放、旋转、甚至仿射变换保持不变性的图像局部特征描述算子——Sift(尺度不变特征变换),全称是Scale Invariant Feature Transform,并且在2004年,又对Sift算法做了更为系统的完善。下边这位老爷子就是Lowe。
Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。Sfit的应用范围包括物体辨别、机器人地图感知与导航、影响拼接、3D模型建立、手势识别、影响追踪等。
Sift特征的特点:
1. 对旋转、尺度缩放、亮度变化保持不变性,对视角变化、噪声等也存在一定程度的稳定性;
2. 独特性,信息量丰富,适用于在海量特征数据中进行快速,准确的匹配;
3. 多量性,即使少数几个物体也可以产生大量的Sfit特征向量;
4. 可扩展性,可以很方便的与其他形式的特征向量进行联合;
Sfit算法的实质是在不同的尺度空间上查找关键点(特征点),计算关键点的大小、方向、尺度信息,利用这些信息组成关键点对特征点进行描述的问题。Sift所查找的关键点都是一些十分突出,不会因光照,仿射便函和噪声等因素而变换的"稳定"特征点,如角点、边缘点、暗区的亮点以及亮区的暗点等。匹配的过程就是对比这些特征点的过程,这个流程可以用下图表述:
一、 图像金字塔
图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。
获得图像金字塔一般包括二个步骤:
1. 利用低通滤波器平滑图像
2. 对平滑图像进行抽样(采样)
有两种采样方式——上采样(分辨率逐级升高)和下采样(分辨率逐级降低)
上采样:
下采样:
二、高斯金字塔
高斯金字塔式在Sift算子中提出来的概念,首先高斯金字塔并不是一个金字塔,而是有很多组(Octave)金字塔构成,并且每组金字塔都包含若干层(Interval)。
高斯金字塔构建过程:
1. 先将原图像扩大一倍之后作为高斯金字塔的第1组第1层,将第1组第1层图像经高斯卷积(其实就是高斯平滑或称高斯滤波)之后作为第1组金字塔的第2层,高斯卷积函数为:
对于参数σ,在Sift算子中取的是固定值1.6。
2. 将σ乘以一个比例系数k,等到一个新的平滑因子σ=k*σ,用它来平滑第1组第2层图像,结果图像作为第3层。
3. 如此这般重复,最后得到L层图像,在同一组中,每一层图像的尺寸都是一样的,只是平滑系数不一样。它们对应的平滑系数分别为:0,σ,kσ,k^2σ,k^3σ……k^(L-2)σ。
4. 倒数第三层
三、 尺度空间
图像的尺度空间解决的问题是如何对图像在所有尺度下描述的问题。
在高斯金字塔中一共生成O组L层不同尺度的图像,这两个量合起来(O,L)就构成了高斯金字塔的尺度空间,也就是说以高斯金字塔的组O作为二维坐标系的一个坐标,不同层L作为另一个坐标,则给定的一组坐标(O,L)就可以唯一确定高斯金字塔中的一幅图像。
尺度空间的形象表述:
上图中尺度空间中k前的系数n表示的是第一组图像尺寸是当前组图像尺寸的n倍。
四、 DOG金字塔
差分金字塔,DOG(Difference of Gaussian)金字塔是在高斯金字塔的基础上构建起来的,其实生成高斯金字塔的目的就是为了构建DOG金字塔。
DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为DOG金字塔的第o组第l层图像是有高斯金字塔的第o组第l+1层减第o组第l层得到的。
DOG金字塔的构建可以用下图描述:
每一组在层数上,DOG金字塔比高斯金字塔少一层。后续Sift特征点的提取都是在DOG金字塔上进行的。
DOG金字塔的显示效果如下:
这些长得黑乎乎的图像就是差分金字塔的实际显示效果,只在第1组第1层差分图像上模糊可以看到一个轮廓。但其实这里边包含了大量特征点信息,只是我们人眼已经分辨不出来了。
下边对这些DOG图像进行归一化,可有很明显的看到差分图像所蕴含的特征,并且有一些特征是在不同模糊程度、不同尺度下都存在的,这些特征正是Sift所要提取的"稳定"特征:
Sfit特征提取和匹配具体步骤
1. 生成高斯差分金字塔(DOG金字塔),尺度空间构建
2. 空间极值点检测(关键点的初步查探)
3. 稳定关键点的精确定位
4. 稳定关键点方向信息分配
5. 关键点描述
6. 特征点匹配
以下对这6个步骤逐一说明。
1. 生成高斯差分金字塔(DOG金字塔),尺度空间构建
主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测不同分辨率上的关键点提取等。
各尺度下图像的模糊度逐渐变大,能够模拟人在距离目标由近到远时目标物体在视网膜上的形成过程。
尺度空间构建的基础是DOG金字塔,DOG金字塔构建的基础是高斯金字塔,关于尺度空间、高斯金字塔、DOG金字塔的相关说明,可以参看前一篇博文《Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔》。贴一下高斯金字塔的实例图像:
归一化的DOG金字塔实例图像:
2. 空间极值点检测(关键点的初步查探)
为了寻找DOG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度空间域的相邻点大或者小,如下图所示:
在二维图像空间,中心点与它3*3邻域内的8个点做比较,在同一组内的尺度空间上,中心点和上下相邻的两层图像的2*9个点作比较,如此可以保证检测到的关键点在尺度空间和二维图像空间上都是局部极值点。
3. 稳定关键点的精确定位
DOG值对噪声和边缘比较敏感,所以在第2步的尺度空间中检测到的局部极值点还要经过进一步的筛选,去除不稳定和错误检测出的极值点,另一点就是在构建高斯金字塔过程中采用了下采样的图像,在下采样图像中提取的极值点对应在原始图像中的确切位置,也是要在本步骤中解决的问题。
4. 稳定关键点方向信息分配
稳定的极值点是在不同尺度空间下提取的,这保证了关键点的尺度不变性。为关键点分配方向信息所要解决的问题是使得关键点对图像角度和旋转具有不变性。方向的分配是通过求每个极值点的梯度来实现的。
对于任一关键点,其梯度幅值表述为:
梯度方向为:
分配给关键点的方向并不直接是关键点的梯度方向,而是按照一种梯度方向直方图的方式给出的。
具体的方法是:计算以关键点为中心的邻域内所有点的梯度方向,当然梯度方向一定是在0~360°范围内,对这些梯度方向归一化到36个方向内,每个方向代表了10°的范围。然后累计落到每个方向内的关键点个数,以此生成梯度方向直方图。
将梯度方向直方图中纵坐标最大的项代表的方向分配给当前关键点作为主方向,若在梯度直方图中存在一个相当于主峰值80%能量的峰值,则将这个方向认为是关键点的辅方向。辅方向的设计可以增强匹配的鲁棒性,Lowe指出,大概有15%的关键点具有辅方向,而恰恰是这15%的关键点对稳定匹配起到关键作用。
5. 关键点描述
对关键点的描述是后续实现匹配的关键步骤,描述其实就是一种以数学方式定义关键的过程。描述子不但包含关键点,也包括关键点周围对其有贡献的邻域点。
描述的思路是:对关键点周围像素区域分块,计算快内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象表述。
如下图,对于2*2块,每块的所有像素点的荼毒做高斯加权,每块最终取8个方向,即可以生成2*2*8维度的向量,以这2*2*8维向量作为中心关键点的数学描述。
David G.Lowed的实验结果表明:对每个关键点,采用4*4*8共128维向量的描述子进项关键点表征,综合效果最佳:
6. 特征点匹配
特征点的匹配是通过计算两组特征点的128维的关键点的欧式距离实现的。欧式距离越小,则相似度越高,当欧式距离小于设定的阈值时,可以判定为匹配成功。
Sift特征匹配效果: