(转载: http://blog.csdn.net/jiang1st2010/article/details/6567452)

SURF 描述子

第一部分:兴趣点的检测

1、 建立积分图。

优点:任何一个垂直矩形区域的面积只需要进行3次 +/-法就能计算。一阶的haar小波响应只要5次+/-法就能计算。计算的时间和区域大小无关。

2、 建立图像的尺度空间(应该分别有Dxx、Dxy、Dyy 三个尺度金字塔):

用box filters代替二阶高斯差分模板。

保持图像的大小不变,对box filters进行尺度变换:建立高斯金字塔,金字塔分为多个Octaves,每个Octave分为4个Scale levels。第一级的Octave的模块大小为9、15、21、27(相差6),第二级为15、27、39、51(相差12),第三级为27、51、75、99(相差24)。每一级第一个level的大小为上一级第二个level的大小。继续建立高斯金字塔,直到filter的大小大于原图像的大小为止(问题是大于每一Octave的第一个mask大小还是最后一个mask的大小?)。

尺度变换的方法,与每个Octave第一个scale level的size(L)/3有关,例如第一个Octave的L为9,L/3=9/3=3,则对于每行/列,连续出现L/3个相同的值,则再插入2个相同的值。若某连续3行同时为1,则再插入两行0。若只连续1行为1,则1*(2/3)=1(四舍五入)。插入的行/列要求左右/上下对称。

3、 对于尺度空间中的每一个box filter,与图像卷积,计算每一点上的Dxx、Dyy、Dxy,再计算每一点Hessian矩阵的行列式。(卷积可以用积分图实现快速计算。)

det(Happrox) = DxxDyy - (wDxy)^2

其中w是因为box filters只是高斯二阶差分的近似,为了使行列式的值大致相等,乘以这个权值,取0.9。注意,每Octave提高一级,计算行列式的时候,采样的间隔提高一倍。例如第一个Octave,每个点都计算,到了第二个Octave,隔一个点计算一个……(用增大模板大小,对图像上的点采样计算的方法,等同于实现对图像进行下采样并改变模板尺度的大小。)

对于每一个Octave,对计算出行列式的值设一个阈值,大于该阈值的列为候选兴趣点。对候选极值点进行非极大抑制:对于该level的周围8个点以及上下scale level相应位置的9*2个点,一共26个点进行比较行列式的大小,若该点是周围26个点中行列式最大的,则保留。(每一个Octave的头尾两个scale level是没法计算的。)

为什么可以用Hessian矩阵来判断极小值/极大值,请见最后。

最后,内插子像素精确定位(具体未看)。

第二部分:特征描述子

1、 主方向的确定(U-Surf没有此步骤)

s = 当前mask大小 * 1.2 / 9

以兴趣点为中心,确定6s为半径的圆。对圆内以s为步长的采样点计算haar小波响应(边长为4s)。

以兴趣点为中心,对小波响应进行高斯加权()。对一个扇形区间(比如π/3)的水平和垂直方向的小波响应分别求和。最长矢量对应的扇形方向就是主方向。(每一个扇形窗可否有重复?)

2、 以兴趣点为中心,主方向为参考x轴方向,20s为边长,做正方形区域,并将该区域分为4*4个子区域。(SURF-36把它分为3*3个子区域,区分性略差但速度快。)每个子区域取5*5个采样点,计算这些采样点上的haar小波响应dx和dy。以兴趣点为中心,对响应进行高斯加权(σ=3.3s)。

3、 对每个子区域的dx、dy、|dx|、|dy|进行求和,归一化为单位向量。对于4*4个子块一共可以构成64维空间。(SURF-128在统计dx和|dx|时,把dy分为大于0时候和小于0时候两种情况,而在统计dy和|dy|时将dx分为大于0和小于0两种情况,这样每个子区域是8维向量)。

与SIFT比较

共同点:

SIFT/SURF为了实现不同图像中相同场景的匹配,主要包括三个步骤:

1、尺度空间的建立;

2、特征点的提取;

3、利用特征点周围邻域的信息生成特征描述子

4、特征点匹配。

从博客上看到一片文章,http://blog.csdn.net/cy513/archive/2009/08/05/4414352.aspx,这一段的大部分内容源于这篇文章,推荐大家去看看。

如果两幅图像中的物体一般只是旋转和缩放的关系,加上图像的亮度及对比度的不同,要在这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。

如何找到这样的匹配点呢?SIFT/SURF作 者的想法是首先找到图像中的一些“稳定点”,这些点是一些特殊的点,不会因为视角的改变、光照的变化、噪音的干扰而消失,比如角点、边缘点、暗区域的亮点 以及亮区域的暗点。这样如果两幅图像中有相同的景物,那么这些稳定点就会在两幅图像的相同景物上同时出现,这样就能实现匹配。因此,SIFT/SURF算法的基础是稳定点。

SIFT/SURF提取的稳定点,首先都要求是局部极值。但是,当两个物体的大小比例不一样时,大图像的局部极值点在小图像的对应位置上有可能不是极值点。于是SIFT/SURF都采用图像金字塔的方法,每一个截面与原图像相似,这样两个金字塔中就有可能包含大小最近似的两个截面了。

这样找到的特征点会比较多,经过一些处理后滤掉一些相对不稳定的点。

接下来如何去匹配相同物体上对应的点呢?SIFT/SURF的作者都想到以特征点为中心,在周围邻域内统计特征,将特征附加到稳定点上,生成特征描述子。在遇到旋转的情况下,作者们都决定找出一个主方向,然后以这个方向为参考坐标进行后面的特征统计,就解决了旋转的问题。

共同的大问题有以下几个:

1、为什么选用高斯金字塔来作特征提取?

为什么是DOG的金字塔?因为它接近LOG,而LOG的极值点提供了最稳定的特征,而且DOG方便计算(只要做减法。)

为什么LOG的极值点提供的特征最稳定,有参考文献,未看。

(7.12补充:)直观理解:特征明显的点经过不同尺度的高斯滤波器进行滤波后,差别较大,所以用到的是DOG。

但是直观上怎么理解?如果相邻Octave的sigma不是两倍关系还好理解:如果两幅图像只是缩放的关系,那么假设第一个Octave找到了小一倍图像的极值点,那么大一倍图像的极值点会在下一个Octave找到相似的。但是现在,如果把大一倍图像进行一次下采样(这样和小的图像就完全一样了),进行Gauss滤波时,两个图像滤波系数(sigma)是不一样的,不就找不到一样的极值点了么?不理解。

2、Hessian矩阵为什么能用来筛选极值点?

SIFT先利用非极大抑制,再用到Hessian矩阵进行滤除。SURF先用Hessian矩阵,再进行非极大抑制。SURF的顺序可以加快筛选速度么?(Hessian矩阵滤除的点更多?)

至于SURF先用Hessian矩阵,再进行非极大抑制的原因,是不管先极大值抑制还是判断Hessian矩阵的行列式,金字塔上的点的行列式都是要计算 出来的。先判断是否大于0只要进行1次判断,而判断是否是极大值点或者极小值点要与周围26个点比较,只比较1次肯定快。

而在SIFT中,构建的高斯金字塔只有一座(不想SURF是有3座),要进行非极大抑制可以直接用金字塔的结果进行比较。而如果计算Hessian矩阵的 行列式,还要再计算Dxx、Dxy、Dyy。因此先进行非极大抑制。这两个步骤的先后与SIFT/SURF的实际计算情况有关的,都是当前算法下的最佳顺 序,而不是说哪种先计算一定更好。
3、为什么采用梯度特征作为局部不变特征?

这与人的视觉神经相关。采用梯度作为描述子的原因是,人的视觉皮层上的神经元对特定方向和空间频率的梯度相应很敏感,经过SIFT作者的一些实验验证,用梯度的方法进行匹配效果很好。

4、为什么可以采用某些特征点的局部不变特征进行整幅图像的匹配?

我在一份博客上找到这样一句话:(http://apps.hi.baidu.com/share/detail/32318290,大家可以看看这篇文章。)

从直观的人类视觉印象来看,人类视觉对物体的描述也是局部化的,基于局部不变特征的图像识别方法十分接近于人类视觉机理,通过局部化的特征组合,形成对目标物体的整体印象,这就为局部不变特征提取方法提供了生物学上的解释,因此局部不变特征也得到了广泛应用。

还有:

图像中的每个局部区域的重要性和影响范围并非同等重要,即特征不是同等显著的,其主要理论来源是Marr的计算机视觉理论和Treisman的特征整合理论,一般也称为“原子论”。该理论认为视觉的过程开始于对物体的特征性质和简单组成部分的分析,是从局部性质到大范围性质。

SIFT/SURF都是对特征点的局部区域的描述,这些特征点应该是影响重要的点,对这些点的分析更加重要。所以在局部不变特征的提取和描述时也遵循与人眼视觉注意选择原理相类似的机制,所以SIFT/SURF用于匹配有效果。

不同点的比较:

从博客上看到一个总结,我修改了一些内容。大家可以参看以下链接:

http://blog.csdn.net/ijuliet/archive/2009/10/07/4640624.aspx

  SIFT SURF
尺度空间 DOG与不同尺度的图片卷积 不同尺度的box filters与原图片卷积
特征点检测 先进行非极大抑制,再去除低对比度的点。再通过Hessian矩阵去除边缘的点 先利用Hessian矩阵确定候选点,然后进行非极大抑制
方向 在正方形区域内统计梯度的幅值的直方图,找max对应的方向。可以有多个方向。 在圆形区域内,计算各个扇形范围内x、y方向的haar小波响应,找模最大的扇形方向
特征描述子 16*16的采样点划分为4*4的区域,计算每个区域的采样点的梯度方向和幅值,统计成8bin直方图,一共4*4*8=128维 20*20s的区域划分为4*4的子区域,每个子区域找5*5个采样点,计算采样点的haar小波响应,记录∑dx,∑dy,∑|dx|,∑|dy|,一共4*4*4=64维

SURF—金字塔仅仅是用来做特征点的检测。在计算描述子的时候,haar小波响应是计算在原图像(利用积分图)。而SIFT是计算在高斯金字塔上(注意不是高斯差分金字塔。)

性能的比较:

论文:A comparison of SIFT, PCA-SIFT and SURF 对三种方法给出了性能上的比较,源图片来源于Graffiti dataset,对原图像进行尺度、旋转、模糊、亮度变化、仿射变换等变化后,再与原图像进行匹配,统计匹配的效果。效果以可重复出现性为评价指标。

比较的结果如下:

method

Time

Scale

Rotation

Blur

Illumination

Affine

Sift

common

best

best

common

common

good

Pca-sift

good

good

good

best

good

best

Surf 

best

common

common

good

best

good

由此可见,SIFT在尺度和旋转变换的情况下效果最好,SURF在亮度变化下匹配效果最好,在模糊方面优于SIFT,而尺度和旋转的变化不及SIFT,旋转不变上比SIFT差很多。速度上看,SURF是SIFT速度的3倍。

http://www.bfcat.com/index.php/2012/06/sift-surf/

http://www.cppblog.com/lovedday/archive/2007/05/14/24075.html

http://140.130.15.147/半導體及光電學程網頁/下載/課程教材/自動化光學檢測/ch05_影像濾波.pdf 各种滤波

http://bingloveu.blog.163.com/blog/static/184441194201132474932654/ surf

模式识别之不变矩---SIFT和SURF的比较的更多相关文章

  1. 在OpenCV3.1.0中使用SIFT,SURF算法

    写在前边: 1.我使用的是python2.7 + OpenCV3.1.0 2.OpenCV3.0.0+的文档有很大问题,很多文档写的还是OpenCV2.0+, OpenCV3.0+根本用不了,其中有一 ...

  2. Opencv Sift和Surf特征实现图像无缝拼接生成全景图像

    Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...

  3. sift、surf、orb 特征提取及最优特征点匹配

    目录 sift sift特征简介 sift特征提取步骤 surf surf特征简介 surf特征提取步骤 orb orb特征简介 orb特征提取算法 代码实现 特征提取 特征匹配 附录 sift si ...

  4. Computer Vision_33_SIFT:ORB_An efficient alternative to SIFT or SURF——2012

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  5. sift 与 surf 算法

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

  6. python opencv3 特征提取与描述 DoG SIFT hessian surf

    git:https://github.com/linyi0604/Computer-Vision DoG和SIFT特征提取与描述 # coding:utf-8 import cv2 # 读取图片 im ...

  7. 图像处理检测方法 — SIFT和SURF

    0.特征与匹配方法总结汇总对比 参考网址:http://simtalk.cn/2017/08/18/%E7%89%B9%E5%BE%81%E4%B8%8E%E5%8C%B9%E9%85%8D/#ORB ...

  8. python利用sift和surf进行图像配准

    1.SIFT特征点和特征描述提取(注意opencv版本) 高斯金字塔:O组L层不同尺度的图像(每一组中各层尺寸相同,高斯函数的参数不同,不同组尺寸递减2倍) 特征点定位:极值点 特征点描述:根据不同b ...

  9. ORB an efficient alternative to SIFT or SURF

    AbstractFeature matching is at the base of many computer vision problems, such as object recognition ...

随机推荐

  1. showModalDialog实现本页面内部跳转

    showModalDialog的弹窗中,要实现本窗口跳转而不打开新窗口,要么submit提交,要么按如下跳转,而不能采用location=xx来跳转:function go_link(url) {   ...

  2. Django AUTHENTICATION_BACKENDS

    指定认证后端 Django维护一个”authentication backends”的列表用来测试认证.当调用 django.contrib.auth.authenticate() — Django将 ...

  3. 关于element-ui select组件change事件只要数据变化就会触发的解决办法

    使用select组件和表格组件结合起来用,但是发现在点击下一页的时候,由于select当中的数据发生了变化,所以也会触发select当中的change事件,但是我只希望在我主动改变select组件当中 ...

  4. springboot+Jib+Maven+Idea+Docker 实践

    Jib - Containerize your Maven project 2. Jib+Maven+Springboot 实践代码例子 2.1在maven项目中的pom.xml文件中配置Jib插件 ...

  5. 标准C程序设计七---51

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  6. AC日记——最优贸易 codevs 1173

    题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...

  7. 快速上手 Echarts

    最近使用到了 百度的 Echarts 数据可视化工具,这里简单介绍如何快速上手. 一.下载 这里选择目前最新版本,4.2.1 地址:https://github.com/apache/incubato ...

  8. luogu P1402 酒店之王

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

  9. java三角形和菱形的打印

    一.三角形的打印 package 向家康; import java.util.Scanner; public class Main { public void san(int num) { for(i ...

  10. Maven 项目打包发布

    在Eclipse左侧右击项目,Debug As -> Debug Configurations -> 双击Maven Build 然后看弹出框的右侧右侧的Name随便填写一个名字,Base ...