教程>SIFT检测器和描述符

这个尺度不变特征变换(SIFT)捆绑了一个特性检测器和一个特性描述符。检测器从图像中提取若干帧(归属区域)以与(某些)一致的方式照明、视点和其他视图的变化条件。描述符将一个签名与区域相关联,该签名简洁有力地识别其外观。为了更多算法的深入描述,请参阅我们的SIFT的API参考.

提取帧和描述符

检测器和描述符都可以通过以下方式访问这个vl_英尺MATLAB命令(也有类似的命令线路实用程序)。打开MATLAB并加载测试图像

I=vl_impattern(“屋顶1”);图像(I);
输入图像。

这个vl_英尺命令需要单精度灰色缩放图像。它还希望将范围标准化为[0255]间隔(虽然这不是严格要求的,但默认值为针对这种情况调整了一些内部阈值)。图像被转换为适当的格式

I=单个(rgb2灰色(I));

我们通过以下公式计算SIFT帧(关键点)和描述符

[f,d]=vl_sift(I);

矩阵(f)每个框架都有一列。框架是指中心盘f(1:2),刻度f(3)方向f(4).我们将随机选择50个功能依据:

perm=randperm(大小(f,2));sel=坡率(1:50);h1=vl_plotframe(f(:,sel));h2=vl_plotframe(f(:,sel));设置(h1,‘颜色’,‘k’,‘线宽’,3);设置(h2,‘颜色’,‘y’,‘线宽’,2);
一些检测到的SIFT帧。

我们还可以通过以下方式覆盖描述符

h3=vl_plotsift描述符(d(:,sel),f(:,se));设置(h3,‘颜色’,‘g’);
峰值阈值参数的测试图像。

基本匹配

SIFT描述符通常用于在两个图像。vl_ubc匹配实现基本匹配算法。国际航空公司是的图像相同的物体或场景。我们通过以下方式提取和匹配描述符:

[fa,da]=vl_sift(Ia);[fb,db]=vl_sift(Ib);[匹配,分数]=vl_ubcmatch(da,db);
上图:同一场景的一对图像。底部:SIFT匹配描述符vl_ubc匹配.

对于中的每个描述符数据采集,vl_ubc匹配发现中最近的描述符数据库(按L2标准测量他们之间的差异)。原始匹配的索引和最接近的描述符存储在比赛并且这对之间的距离存储在分数.

还可以通过传递第三个匹配项来筛选唯一性参数到vl_ubc匹配指定阈值。这里,一对的唯一性是以最佳匹配关键点与到第二好的(参见vl_ubc匹配以获得进一步的细节)。

探测器参数

SIFT检测器主要由两个参数控制:峰值阈值和(非)边缘阈值。

这个峰值阈值过滤DoG尺度空间的峰值(绝对值)太小。例如,考虑一个二维高斯斑点的测试图像:

I=两倍(兰特(100500)<=.005);I=(个(100,1)*linspace(0,1500)).*I;I(:,1)=0;I(:,结束)=0;I(1,:)=0;I(结束,:)=0;I=2*pi*4^2*vl_imsmooth(I,4);I=单个(255*I);
峰值阈值参数的测试图像。

我们用峰值阈值运行检测器峰值_阈值通过

f=vl_sift(I,‘峰值阈值’,峰值阈值);

获得较少的功能峰值_阈值增加。

检测到峰值阈值增加的帧。
从顶部开始:峰值thresh={0,10,20,30}.

这个边缘阈值消除的峰值曲率太小的DoG尺度空间(此类峰值产生严重本地化的帧)。例如,考虑测试图像

I=零(100500);对于i=[10 20 30 40 50 60 70 80 90]I(50圆(I/3):50+圆(I/3),I*5)=1;结束I=2*pi*8^2*vl_ims光滑(I,8);I=单个(255*I);
边缘阈值参数的测试图像。

我们用边缘阈值运行检测器边缘_阈值通过

f=vl_sift(I,‘edgethresh’,edge_thresh);

获取更多功能边缘_阈值增加了:

检测到增加边缘阈值的帧。
从顶部开始:edge_thresh={3.5、5、7.5、10}

自定义框架

MATLAB命令vl_英尺(和命令行实用程序)可以绕过检测器,使用这个框架选项。

例如,我们可以计算SIFT帧的描述符居中于位置(100,100),规模为10和方向-圆周率/8通过

fc=[100;100;10;-pi/8];[f,d]=vl_sift(I,‘帧’,fc);
固定方向的自定义框架。

多个帧fc(财务总监)也可以指定。在这个如果它们通过增加比例尺。这个方向选项指示程序使用自定义位置和比例,但要计算关键点方向,如

fc=[100;100;10;0];[f,d]=vl_sft(I,‘框架’,fc,‘方向’);
具有计算方向的自定义框架。

请注意,根据本地外观,关键点可能倍数方向。此外,根据恒定图像区域(例如单像素区域)没有方向!

习俗

在我们的实现中,SIFT帧在标准中表示图像参考。命令行和MATLAB驱动程序是后者假设图像来源(左上角)具有坐标(1,1),而不是(0,0)。Lowe's公司原始实现使用不同的参考系统,如图所示下一步:


我们的约定(顶部)与Lowe的约定(底部)相比。

我们的实现使用标准图像参考系统这个指向下方的轴。框架方向θ和描述符使用相同的引用系统(即x个移动它朝向轴)。回忆一下每个描述符元素是由索引的bin(θ,x,y); 直方图是矢量化的方式θ是最快的变化指数和最慢的。

相比之下,D.Lowe的实现(见图)使用了稍微不同的约定:框架中心是相对于标准图像参考系统表达,但是帧方向和描述符假设轴指向上。因此,从我们的映射到D.Lowe的约定,框架方向需要取反,描述符元素必须重新排列。

与D.Lowe的SIFT的比较

VLFeat SIFT实现在很大程度上与UBC(D.Lowe's)实施(但请注意,关键点存储在格式略有不同,请参见vl增加(_U)). 以下内容图中比较了VLFeat(蓝色)和UBC计算的SIFT关键点(红色)实现。

VLFeat关键点(蓝色)叠加到D.Lowe的关键点(红色)。大多数关键点几乎完全匹配。

大多数关键点几乎完全对应。这个下图显示了两个参数计算的关键点百分比中心匹配精度至少为0.01的实现像素和0.05像素。

从VLFeat和UBC实现中获得的关键点百分比最多匹配0.01像素和0.05像素。

描述符也非常相似。下图显示了两个实现计算的描述符百分比距离小于平均描述符的5%、10%和20%距离。

从VLFeat和UBC获得的描述符百分比距离在平均值10%到20%之间的实施描述符距离。