SURF算法解析

一、积分图像
    积分图像的概念是由Viola和Jones提出的。积分图像中任意一点(i,j)的值为原图像左上角到任意点(i,j)相应的对焦区域的灰度值的总和,其数学公式如图1所示:

那么,当我们想要计算图片一个区域的积分,就只需计算这个区域的四个顶点在积分图像里的值,便可以通过2步加法和2步减法计算得出,其数学公式如下:

二、Hession矩阵探测器
1、斑点检测
    斑点:与周围有着颜色和灰度差别的区域。
    在一个一维信号中,让它和高斯二阶导数进行卷积,也就是拉普拉斯变换,那么在信号的边缘处就会出现过零点,如下图所示:

高斯拉普拉斯Log探测器的响应值就是在衡量图像的相似性,如下图是一个图像的高斯拉普拉斯变换的三维图和灰度图显示,在图像中的斑点尺寸与高斯拉普拉斯函数
的形状趋于一致时,图像的拉普拉斯响应抵达最大。

Hession矩阵就是利用二阶微分来进行斑点检测,其矩阵如下:

2、Hession矩阵与盒子滤波器

在图像中的Hession矩阵如下:

他们的三维图和灰度图如下所示:

由此,我们把模板(图像中的区域)与图像的卷积运算转化为盒子滤波器的运算,如下图所示:

3、hession矩阵行列式的简化

当我们用sigma = 1.2.的高斯二阶微分滤波,模板尺寸为9X9最为最小的尺度空间值对图像进行滤波和斑点检测,Hession矩阵的行列式可做如下简化:

常数C不影响极值点的比较,所以最终简化式如下,这也是SURF论文里面Hession响应值计算公式的来源:

另外,响应值还要根据滤波器大小进行归一化处理,以保证任意大小滤波器的F范数是统一的。0.9^2是滤波器响应的相关权重w是为了平衡Hessian行列式的表示式。这是为了保持高斯核与近似高斯核的一致性。理论上来说对于不同的σ的值和对应尺寸的模板尺寸,w值是不同的,但为了简化起见,可以认为它是同一个常数。 使用近似的Hessian矩阵行列式来表示图像中某一点x处的斑点响应值,遍历图像中所有的像元点,便形成了在某一尺度下琉璃点检测的响应图像。使用不同的模板尺寸,

便形成了多尺度斑点响应的金字塔图像,利用这一金字塔图像,就可以进行斑点响应极值点的搜索。

三、3D非极大值抑制

1、尺度金字塔构造

在SURF中,采用不断增大盒子滤波器模板尺寸与积分图像求取Hession矩阵响应,然后在响应图像上采用3D非极大值抑制,求取各种不同尺度

的斑点,以下是两种不同的金字塔,SURF的金字塔属于第二种:

SURF中采用9X9尺寸的滤波器作为起始滤波器,之后的滤波器尺寸可由以下公式计算得出:

octave、interval在公式中都是从1开始,也就是当第0组第0层时,在公式中octave = 1, interval = 1。

采用这种方式来定义滤波器尺寸的理由如下;

滤波器响应长度、滤波器尺寸、组索引O、层索引S

尺度sigma之间的关系如下:

采用类似的方法来处理其他几组的模板序列。其方法是将滤波器尺寸增加量翻倍(6,12,24,38)。这样,可以得到第二组的滤波器尺寸,它们分别为15,27,39,51。第三组的滤波器尺寸为27,51,75,99。如果原始图像的尺寸仍然大于对应的滤波器尺寸,尺度空间的分析还可以进行第四组,其对应的模板尺寸分别为51,99,147,195。下图显示了第一组至第三组的滤波器尺寸变化:

在通常尺度分析情况下,随着尺度的增大,被检测到的斑点数量迅速衰减。所以一般进行3-4组就可以了,与此同时,为了减少运算量,提高计算的速度,可以考虑在滤波时,将采样间隔设为2。
    2、为了在图像及不同尺寸中定位兴趣点,我们用了3×3×3邻域非最大值抑制:
所有小于预设极值的取值都被丢弃,增加极值使检测到的特征点数量减少,最终只有几个特征最强点会被检测出来。检测过程中使用与该尺度层图像解析度相对应大小的滤波器进行检测,以3×3的滤波器为例,该尺度层图像中9个像素点之一图2检测特征点与自身尺度层中其余8个点和在其之上及之下的两个尺度层9个点进行比较,共26个点,图中标记‘x’的像素点的特征值若大于周围像素则可确定该点为该区域的特征点。

3、局部极大值精确定位

采用3维线性插值法得到亚像素级的特征点,同时也去掉那些值小于一定阈值的点。

四、特征点描述符

1、特征点方向分配

以特征点为中心,计算半径为6s(S为特征点所在的尺度值)的邻域内的点在x、y方向的Haar小波(Haar小波边长取4s)响应,Harr小波

模板如图所示:

计算出图像在哈尔小波的x和y方向上的响应值之后,对两个值进行因子为2S的高斯加权,加权后的值分别表示在水平和垂直方向上的方向分量。

Harr特征值反应了图像灰度变化的情况,那么这个主方向就是描述那些灰度变化特别剧烈的区域方向。

接着,以特征点为中心,张角为π/3的扇形滑动,计算窗口内的Harr小波响应值dx、dy的累加:

扇形窗口的滑动如图所示:

在OpenSURF的C++代码实现如下:

  for(int i = -6; i <= 6; ++i)
{
for(int j = -6; j <= 6; ++j)
{
if(i*i + j*j < 36)
{
gauss = static_cast<float>(gauss25[id[i+6]][id[j+6]]);
resX[idx] = gauss * haarX(r+j*s, c+i*s, 4*s);
resY[idx] = gauss * haarY(r+j*s, c+i*s, 4*s);
Ang[idx] = getAngle(resX[idx], resY[idx]);
++idx;
}
}
}

  

通过i,j来控制以特征点为中心的6X6的范围,(i*i + j*j < 36)则筛选落在以特征点为中心,半径为6s的圆形区域内的点,然后计算HaarX与HarrY并与通过事先计算好的Gauss

滤波。并计算出每个点的角度。

最后将最大值那个扇形的方向作为该特征点的主方向。在OpenSURF寻找扇形中具有最大值得方向代码如下:

 for(ang1 = 0; ang1 < 2*pi;  ang1+=0.15f) {
ang2 = ( ang1+pi/3.0f > 2*pi ? ang1-5.0f*pi/3.0f : ang1+pi/3.0f);
sumX = sumY = 0.f;
for(unsigned int k = 0; k < Ang.size(); ++k)
{
// get angle from the x-axis of the sample point
const float & ang = Ang[k]; // determine whether the point is within the window
if (ang1 < ang2 && ang1 < ang && ang < ang2)
{
sumX+=resX[k];
sumY+=resY[k];
}
else if (ang2 < ang1 &&
((ang > 0 && ang < ang2) || (ang > ang1 && ang < 2*pi) ))
{
sumX+=resX[k];
sumY+=resY[k];
}
} // if the vector produced from this window is longer than all
// previous vectors then this forms the new dominant direction
if (sumX*sumX + sumY*sumY > max)
{
// store largest orientation
max = sumX*sumX + sumY*sumY;
orientation = getAngle(sumX, sumY);
}
}

  

2、特征点特征矢量的生成

以特征点为中心,沿主方向将20SX20S的图像划分为4X4个子块,每个子块用尺寸2S的Harr模板进行响应值计算,并统计每个子块中


这样就有4X4X4=64维的特征数据。如下图所示:

在计算这个矩形区域时并不是先把它旋转到主方向,而是先计算出每一个点的Harr响应值dx、dy并高斯加权处理后,把dx、dy进行旋转变换,计算

公式如下:

在OpenSURF的实现源码中采用的是另外一种方式,通过点旋转公式,把点旋转到主方向上并进行最近邻插值的对应点,公式如下:

五、匹配

为了加速匹配过程,SURF借助Laplacian(在之前计算Hessian是可以顺便得出,不占用太多的时间)的符号使匹配过程索引加快。这样可以将下面的情况区分开,然后在进行描述符匹配:

参考资料:http://www.cnblogs.com/ronny/p/4045979.html

http://doc.okbase.net/ronny/archive/107771.html

http://www.tuicool.com/articles/2i6fqq3

http://wenku.baidu.com/view/cf0c164f2e3f5727a5e96238.html

转自:http://blog.csdn.net/cxp2205455256/article/details/41311013

[转]SURF算法解析的更多相关文章

  1. surf算法解析

    surf构造的金字塔图像与sift有很大的不同,sift采用的是DOG图像,surf采用的是hessian矩阵行列式近似值图像,hessian矩阵是surf算法的核心,构建hessian矩阵的目的是为 ...

  2. SURF算法与源码分析、上

    如果说SIFT算法中使用DOG对LOG进行了简化,提高了搜索特征点的速度,那么SURF算法则是对DoH的简化与近似.虽然SIFT算法已经被认为是最有效的,也是最常用的特征点提取的算法,但如果不借助于硬 ...

  3. SURF算法与源码分析、下

    上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV中的源码分析,这篇文章接着上篇文章对已经定位到的SURF特征点进行特征描述.这一步至关重要,这是SU ...

  4. sift 与 surf 算法

    http://blog.csdn.net/cy513/article/details/4414352 SURF算法是SIFT算法的加速版,OpenCV的SURF算法在适中的条件下完成两幅图像中物体的匹 ...

  5. 特征点检测学习_2(surf算法)

    依旧转载自作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 特征点检测学习_2(surf算法) 在上篇博客特征点检测学习_1(sift算法) 中 ...

  6. 模式匹配之surf----特征点检测学习_2(surf算法)

    在上篇博客特征点检测学习_1(sift算法) 中简单介绍了经典的sift算法,sift算法比较稳定,检测到的特征点也比较多,其最大的确定是计算复杂度较高.后面有不少学者对其进行了改进,其中比较出名的就 ...

  7. opencv3.0中contrib模块的添加+实现SIFT/SURF算法

    平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake+Anaconda3(python3.7.0) Issue说明:Opencv3.0版本已经发布了有一段时间,在这段 ...

  8. SURF算法源代码OPENSURF分析

    SURF算法源代码分析 平台:win x64 + VS2015专业版 +opencv2.4.11 配置类似参考OPENSIFT,参考我的另一篇博客:https://www.cnblogs.com/Al ...

  9. 地理围栏算法解析(Geo-fencing)

    地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界 ...

随机推荐

  1. IE与标准浏览器对事件处理的区别

    1.监听 标准 element.addEventListener('click',observer, useCapture); element.removeEventListener('click', ...

  2. Git 基础教程 之 添加远程仓库

    b, 本地内容推送至远程库上         git push -u origin master        实际上是把当前分支master推送到远程仓库,第一次推送时,加上-u参数, 表示Git不 ...

  3. opencv学习HighGUI图形用户界面初步【1】

    HighGUI是图形用户界面模块.包括:1.输入与输出:2.视频捕捉:3.图形和视频的解码编码:4.图形交界面与接口. 由于opencv.hpp包含了core.objdetect.ingproc.ph ...

  4. 自建X509证书

    X509证书是需要买的,自己建的证书不会被浏览器认可,会弹出提示安全不受保障的页面. 学习一下如何建,实际用到还是要买. 打开vs2015开发员人员命令提示 输入创建证书的命令 Makecert.ex ...

  5. HDU 3432

    水题,就是把一个矩形平分. 题意:一个wid*hei的矩形,过底边上的一点(dor,0)做m-1条射线,把这个矩形的面积平均分成m份,求这些射线和矩形的另外一个交点. 直接枚举,然而求三角形高底移动坐 ...

  6. 【转】三年后再反思我的" Java Web项目管理得失谈"

    原文: http://blog.csdn.net/csfreebird/article/details/7561189 这篇文章介绍的经验心得不错,故转载之. 三年前,我写了 JavaWeb项目管理得 ...

  7. 网络编程----堵塞、非堵塞和同步、异步IO

    我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...

  8. selenium实例学习地址

    一个完整的maven配置selenium webdriver工程实例   http://www.spasvo.com/ceshi/open/kygncsgj/Selenium/201312209580 ...

  9. 什么是A记录、MX记录、CNAME记录具体介绍

    什么是A记录: A (Address) 记录是用来指定主机名(或域名)相应的IP地址记录.用户能够将该域名下的站点服务器指向到自己的web server上. 同一时候也能够设置域名的子域名. 通俗来说 ...

  10. 2016.04.11,英语,《Vocabulary Builder》Unit 12

    umbr, from the Latin umbra, 'shadow', umbrella, -ella, 'little', means 'little shadow'. adumbrate: [ ...