介绍 SURF(Speeded-Up Robust Features)

目标
  本节我们将要学习:
  • SUFR 的基础是什么?
  • OpenCV 中的 SURF
  
原理
  在上一节中我们学习了使用 SIFT 算法进行关键点检测和描述。但是这种算法的执行速度比较慢,人们需要速度更快的算法。在 2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出了 SURF(加速稳健特征)算法。跟它的名字一样,这是个算法是加速版的 SIFT。
  在 SIFT 中,Lowe 在构建尺度空间时使用 DoG 对 LoG 进行近似。SURF使用盒子滤波器(box_filter)对 LoG 进行近似。下图显示了这种近似。在进行卷积计算时可以利用积分图像(积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关),是盒子滤波器的一大优点。而且这种计算可以在不同尺度空间同时进行。同样 SURF 算法计算关键点的尺度和位置是也是依赖与 Hessian 矩阵行列式的。


  为了保证特征矢量具有选装不变形,需要对于每一个特征点分配一个主要方向。需要以特征点为中心,以 6s(s 为特征点的尺度)为半径的圆形区域内,对图像进行 Harr 小波相应运算。这样做实际就是对图像进行梯度运算,但是利用积分图像,可以提高计算图像梯度的效率,为了求取主方向值,需哟啊设计一个以方向为中心,张角为 60 度的扇形滑动窗口,以步长为 0.2 弧度左右旋转这个滑动窗口,并对窗口内的图像 Haar 小波的响应值进行累加。主方向为最大的 Haar 响应累加值对应的方向。在很多应用中根本就不需要旋转不变性,所以没有必要确定它们的方向,如果不计算方向的话,又可以使算法提速。SURF 提供了成为 U-SURF 的功能,它具有更快的速度,同时保持了对 +/-15 度旋转的稳定性。OpenCV 对这两种模式同样支持,只需要对参数upright 进行设置,当 upright 为 0 时计算方向,为 1 时不计算方向,同时速度更快。
  
  生成特征点的特征矢量需要计算图像的 Haar 小波响应。在一个矩形的区域内,以特征点为中心,沿主方向将 20s20s 的图像划分成 44 个子块,每个子块利用尺寸 2s 的 Haar 小波模版进行响应计算,然后对响应值进行统计,组成向量 v = (∑dx{{d}_{x}}dx​,∑dy{{d}_{y}}dy​,∑|dx{{d}_{x}}dx​|,∑|dy{{d}_{y}}dy​|)。这个描述符的长度为 64。降低的维度可以加速计算和匹配,但又能提供更容易区分的特征。
  为了增加特征点的独特性,SURF 还提供了一个加强版 128 维的特征描述符。当 dy 大于 0 和小于 0 时分别对 dx{{d}_{x}}dx​ 和 |dx{{d}_{x}}dx​| 的和进行计算,计算 dy{{d}_{y}}dy​ 和 |dy{{d}_{y}}dy​| 时也进行区分,这样获得特征就会加倍,但又不会增加计算的复杂度。OpenCV 同样提供了这种功能,当参数 extended 设置为 1 时为 128 维,当参数为 0 时为 64 维,默认情况为 128 维。
  在检测特征点的过程中计算了 Hessian 矩阵的行列式,与此同时,计算得到了 Hessian 矩阵的迹,矩阵的迹为对角元素之和。
  按照亮度的不同,可以将特征点分为两种,第一种为特征点迹其周围小邻域的亮度比背景区域要亮,Hessian 矩阵的迹为正;另外一种为特征点迹其周围小邻域的亮度比背景区域要暗,Hessian 矩阵为负值。根据这个特性,首先对两个特征点的 Hessian 的迹进行比较。如果同号,说明两个特征点具有相同的对比度;如果异号的话,说明两个特征点的对比度不同,放弃特征点之间的后续的相似性度量。
  
  对于两个特征点描述子的相似性度量,我们采用欧式距离进行计算。
  简单来说 SURF 算法采用了很多方法来对每一步进行优化从而提高速度。分析显示在结果效果相当的情况下 SURF 的速度是 SIFT 的 3 倍。SURF 善于处理具有模糊和旋转的图像,但是不善于处理视角变化和关照变化。
  
OpenCV 中的 SURF
  与 SIFT 相同 OpenCV 也提供了 SURF 的相关函数。首先我们要初始化一个 SURF 对象,同时设置好可选参数:64/128 维描述符,Upright/Normal 模式等。所有的细节都已经在文档中解释的很明白了。就像我们在SIFT 中一样,我们可以使用函数 SURF.detect(),SURF.compute() 等来进行关键点搀着和描述。
  首先从查找描述绘制关键点开始。由于和 SIFT 一样所以我们的示例都在Python 终端中演示。

>>> img = cv2.imread('fly.png',0)
# Create SURF object. You can specify params here or later.
# Here I set Hessian Threshold to 400
>>> surf = cv2.SURF(400)
# Find keypoints and descriptors directly
>>> kp, des = surf.detectAndCompute(img,None)
>>> len(kp)
699

在一幅图像中显示 699 个关键点太多了。我们把它缩减到 50 个再绘制到图片上。在匹配时,我们可能需要所有的这些特征,不过现在还不需要。所以我们现在提高Hessian 的阈值。

# Check present Hessian threshold
>>> print surf.hessianThreshold
400.0
# We set it to some 50000. Remember, it is just for representing in picture.
# In actual cases, it is better to have a value 300-500
>>> surf.hessianThreshold = 50000
# Again compute keypoints and check its number.
>>> kp, des = surf.detectAndCompute(img,None)
>>> print len(kp)
47

现在低于 50 了,把它们绘制到图像中吧。

>>> img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
>>> plt.imshow(img2),plt.show()

结果如下。你会发现 SURF 很像一个斑点检测器。它可以检测到蝴蝶翅膀上的白班。你可以在其他图片中测试一下。

现在我们试一下 U-SURF,它不会检测关键点的方向。

# Check upright flag, if it False, set it to True
>>> print surf.upright
False
>>> surf.upright = True
# Recompute the feature points and draw it
>>> kp = surf.detect(img,None)
>>> img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
>>> plt.imshow(img2),plt.show()

结果如下。所有的关键点的朝向都是一致的。它比前面的快很多。如果你的工作对关键点的朝向没有特别的要求(如全景图拼接)等,这种方法会更快。

最后我们再看看关键点描述符的大小,如果是 64 维的就改成 128 维。

# Find size of descriptor
>>> print surf.descriptorSize()
64
# That means flag, "extended" is False.
>>> surf.extended
False
# So we make it to True to get 128-dim descriptors.
>>> surf.extended = True
>>> kp, des = surf.detectAndCompute(img,None)
>>> print surf.descriptorSize()
128
>>> print des.shape
(47, 128)

接下来要做的就是匹配了,我们会在后面讨论。

介绍 SURF(Speeded-Up Robust Features)相关推荐

  1. OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

    OpenCV中的SURF(加速健壮功能) 1. 效果图 2. 原理 2.1 为什么SURF比SIFT快? 2.3 怎样获取SIFT与SURF? 3. 源码 参考 上一篇博客介绍了用于关键点检测和描述的 ...

  2. Computer Vision_33_SIFT:Speeded-Up Robust Features (SURF)——2006

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

  3. SURF: speed up robust feature

    SURF: speed up robust feature SURF特点: 1.使用积分图像完成图像卷积(相关)操作; 2,使用Hessian矩阵检测特征值: 3,使用基于分布的描述符(局部信息). ...

  4. [论文笔记] [2008] [ICML] Extracting and Composing Robust Features with Denoising Autoencoders

    在06年以前,想要去训练一个多层的神经网络是比较困难的,主要的问题是超过两层的模型,当时没有好的策略或方法使模型优化的很好,得不到预期的效果.在06年,Hinton提出的stacked autoenc ...

  5. Extracting and Composing Robust Features with Denoising Autoencoders论文笔记

    Extracting and Composing Robust Features with DenoisingAutoencoders 论文链接 零碎知识 网络 原理 结构 训练 论文链接 零碎知识 ...

  6. 5.5. SURF (Speeded-Up Robust Features)简介

    目标: SURF的基础知识 在OpenCV中看到SURF功能 理论 在上一节中我们学习了使用 SIFT 算法进行关键点检测和描述.但是这种算法的执行速度比较慢,人们需要速度更快的算法.在 2006 年 ...

  7. Surf: Speed up robust feature的回顾和思考

    一.Surf由来 SIFT算法比较稳定,检测到的特征点也比较多,但是其最大的缺点是计算复杂度较高.为此,不少学者进行了改进,其中比较出名的就是SURF算法,中文意思为快速鲁棒特征.它是瑞士苏黎世联邦理 ...

  8. 论文笔记(3)-Extracting and Composing Robust Features with Denoising Autoencoders

    这篇文章是Bengio研究的在传统的autoencoder基础上增加了噪声参数,也就是说在输入X的时候,并不直接用X的数据,而是按照一定的概率来清空输入为0.paper中的名词为corrupted.这 ...

  9. 特征提取与检测6-SURF特征检测

    SURF特征检测 SURF特征基本介绍 代码演示 SURF特征基本介绍 SURF(Speeded Up Robust Features)特征关键特性: -特征检测 -尺度空间 -选择不变性 -特征向量 ...

最新文章

  1. 2022-2028年中国化学纤维行业市场研究及前瞻分析报告
  2. ios应用,64位问题,Missing 64-bit support
  3. 初识Nginx服务器
  4. CodeForces - 1409F Subsequences of Length Two(dp)
  5. 你买过假芯片吗?元器件专家为您揭秘假冒芯片的套路!
  6. 在C++中可以用3种方法访问一个字符串
  7. 浏览器测试基本跑分网站
  8. LVDS原理及设计指南
  9. Python入门--文件的读写,相对路径,绝对路径
  10. 光孝寺招聘员工!月薪15000,早九晚五,免费饭菜,有证者优先,工作六根清净,而且.......
  11. 各种开发语言项目环境国内(中国国内加速镜像)配置教程和部分实践经验,包括github.com, nodejs,npm,nvm, yarn, java, maven, gradle, python, m
  12. vue中的keep-alive的用法详细讲解
  13. word的链接到前一节消失
  14. Redis框架(三):大众点评项目 基于Session的短信登录
  15. 《解剖PetShop》系列之五
  16. 【解答】多台西门子PLC之间可不可以无线通讯
  17. 文件中查找并删除feff
  18. 钢构计算机,《钢结构计算机辅助设计》平面桁架.pptx
  19. 禁止navigationController左滑手势
  20. Excel怎么将同一工作簿多个表格合并

热门文章

  1. 图形图像处理 - 实现图片的美容效果
  2. IDL考试前复习笔记(一) 绘制散点图,并标注残差
  3. 个人支付宝微信收款研究突破
  4. 魅族16s Pro上手体验:补齐16s硬件上的不足,增强了拍照能力
  5. 从视频中获取发丝都能看见的人体步态轮廓图
  6. 基于Hexo框架快速搭建个人博客--文章一键发布(五)
  7. JS获取当前时间戳(10位数)
  8. Grafana Dashboard linux安装图表插件
  9. 计算机体系结构流水线相关实验报告,计算机系统结构winDLX流水线实验报告汇编.doc...
  10. 牛市初期标志:半月一次的暴涨暴跌?