目标

在这一章当中,将学习:

  • SURF的基础
  • OpenCV中的SURF函数

理论

在上一章中,看到了SIFT用于关键点检测和描述符。但该算法比较相对缓慢,人们需要更多的加速版本。
2006年,H .Tuytelaars, 和 Van Gool 发表了另一篇论文,“SURF: Speeded Up Robust Features”,引入了一种名为“SURF”的新算法。正如名字所表明的那样,它是一个加速版本的SIFT
在SIFT中,Lowe用高斯差近似高斯的拉普拉斯算子来寻找尺度空间。SURF走得更远,使用Box Filter近似LoG。下图显示了这种近似值的演示。这种近似的一大优点是,借助积分图像可以轻松地计算出box filter的卷积。并且可以针对不同规模并行执行。SURF还依赖于Hessian矩阵的行列式来确定尺度和位置。

对于方向分配,SURF在水平和垂直方向上对大小为6的邻域使用小波响应。适当的高斯权重也适用于它。然后将它们绘制在下图所示的空间中。通过计算角度为60度的滑动方向窗口内所有响应的总和,可以估算主导方向。有趣的是,小波响应可以很容易地使用积分图像在任何规模下发现。对于许多应用,不需要旋转不变性,因此无需查找此方向,从而加快了过程。SURF提供了称为Upright-SURF或U-SURF的功能。它提高了速度,并具有高达±15∘\pm 15^{\circ}±15∘的鲁棒性。OpenCV根据标志支持两种方式。如果为0,则计算方向。如果为1,则不计算方向并且速度更快。

对于功能描述,SURF在水平和垂直方向上使用小波响应(同样,使用积分图像使事情变得更容易)。在s是大小的关键点周围采用大小为20X20的邻域。它分为4x4子区域。对于每个子区域,获取水平和垂直小波响应,并像这样形成向量,v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)v =(\sum dx,\sum dy,\sum |dx|,\sum |dy|)v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)。当表示为向量时,这将为SURF特征描述符提供总共64个维度。尺寸越小,计算和匹配速度越快,但特征的区分性更好。
为了更加具有区分性,SURF特征描述符具有扩展的128维版本。dx和|dx|的和分别针对dy<0和dy≥0进行计算。同样,dy和|dy|的总和根据dx的符号进行拆分,从而使特征数量加倍。它不会增加太多的计算复杂性。OpenCV通过将分别为64-dim和128-dim(默认值为128-dim)的标志的值设置为0 和1来支持这两者(默认为128-dim)。
另一个重要的改进是对基础兴趣点使用了Laplacian算符(海森矩阵的迹)。它不增加计算成本,因为它已在检测期间进行了计算。拉普拉斯算子的标志将深色背景上的明亮斑点与相反的情况区分开。在匹配阶段,仅比较具有相同对比类型的特征(如下图所示)。这些最少的信息可加
快匹配速度,而不会降低描述符的性能。

简而言之,SURF添加了许多功能来提高每一步的速度。分析表明,它的速度是SIFT的3倍,而性能却与SIFT相当。SURF擅长处理具有模糊和旋转的图像,但不擅长处理视点变化和照明变化。

OpenCV中的SURF

OpenCV提供了类似于SIFT的SURF功能。可以使用一些可选条件(例如64/128-dim描述符, Upright / Normal SURF等)来启动SURF对象。所有详细信息在docs中都有详细说明。然后,就像在SIFT中所做的那样,可以使用SURF.detect()SURF.compute()等来查找关键点和描述符。
首先,将看到一个有关如何找到SURF关键点和描述符并进行绘制的简单演示。所有示例都在Python终端中显示,因为它与SIFT相同。

注意 要安装opencv-python==3.4.2.17 才能用

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.xfeatures2d.SURF_create(400)# Find keypoints and descriptors directly
kp, des = surf.detectAndCompute(img, None)
print(len(kp))
# 658

图片中无法显示1967个关键点。将其减少到50左右以绘制在图像上。匹配时,可能需要所有这些功能,但现在不需要。因此,增加海森阈值。

surf.getHessianThreshold()
# 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.setHessianThreshold(50000)# Again compute keypoints and check its number.
kp, des = surf.detectAndCompute(img, None)print(len(kp))
# 42# plot
img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
plt.imshow(img2)
plt.show()

结果如下,可以看到SURF更像是斑点检测器。
现在,想应用U-SURF,并且不需要方向。

print( surf.getUpright() )
# True 默认是方向都一致的
surf.setUpright(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.getExtended()
# False# So we make it to True to get 128-dim descriptors.
surf.setExtended(True)kp, des = surf.detectAndCompute(img,None)
print(surf.descriptorSize())
# 128print(des.shape)
# (47, 128)

附加资源

  • 积分图
  • SURF
  • 版本问题
  • https://senitco.github.io/2017/06/27/image-feature-surf/

opencv34: SURF 加速鲁棒特征相关推荐

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

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

  2. 图像特征提取算法:加速鲁棒特征SURF

    1.原理: Sift算法的优点是特征稳定,对旋转.尺度变换.亮度保持不变性,对视角变换.噪声也有一定程度的稳定性:缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱. Surf(Speeded ...

  3. 一种基于Matlab的快速鲁棒特征点(surf)的图像拼接技术

    一.引言 快速鲁棒特征(Speeded-up robust feature,SURF)算法在图像匹配.模式识别.图像拼接等众多领域有着广泛的应用[1].有学者提出一种基于快速鲁棒特征(SURF)的眼底 ...

  4. 论文翻译 | Mask-SLAM:基于语义分割掩模的鲁棒特征单目SLAM

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1 摘要 本文提出了一种将单目视觉SLAM与基于深度学习的语义分割相结合的新方法.为了稳定运行,vSL ...

  5. Mask-SLAM:基于语义分割掩模的鲁棒特征单目SLAM

    摘要 本文提出了一种将单目视觉SLAM与基于深度学习的语义分割相结合的新方法.为了稳定运行,vSLAM需要静态对象上的特征点.在传统的vSLAM中,随机样本一致性(RANSAC) 用于选择那些特征点. ...

  6. VehicleNet: Learning Robust Visual Representation for Vehicle Re-identification(车辆网络:学习用于车辆再识别的鲁棒视觉)

    摘要:车辆再识别(re-id)的一个基本挑战是学习鲁棒的和有区别的视觉表示,考虑到不同相机视图的显著的类内车辆变化.由于现有的车辆数据集在训练图像和视点等方面的局限性,我们建议利用四个公共车辆数据集构 ...

  7. 【论文摘要】基于多数投票模式和超混沌加密的彩色图像鲁棒安全零水印算法

    Robust and secure zero-watermarking algorithm for color images based on majority voting pattern and ...

  8. OpenCV中的二进制鲁棒独立基本特征——BRIEF

    OpenCV中的二进制鲁棒独立基本特征--BRIEF 1. 效果图 2. 源码 参考 这篇博客将介绍OpenCV中的二进制鲁棒独立基本特征.BRIEF是一种更快的特征描述符计算和匹配方法.它还提供了较 ...

  9. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)

    Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features) 理论 We know SIFT us ...

最新文章

  1. 编程微刊第五期文章汇总(2018.5)
  2. 将 Sidecar 容器带入新的阶段
  3. break prefab instance的原理
  4. 北斗导航 | 复杂环境下卫星导航算法(理论)
  5. MyBatis入门实例-包括实体类与数据库字段对应CLOB字段处理
  6. 基于mindspore的口罩检测训练与在线推理
  7. 飘逸的python - hack输出流便于调试
  8. 计算机应用基础教程作业脑图 车辆工程学院 冯大昕
  9. 让Windows7 x64 IIS7支持32位应用程序
  10. jquery插件合集之图片裁剪
  11. java编程题全集及答案_JAVA编程题全集(100题及答案)q
  12. 笔记本无线自动配置服务器,笔记本无线网卡充当路由器组建局域网
  13. 目录操作 递归打印目录 DIR drent
  14. python基础趣讲精练_Python内置函数精讲精练 enumerate()
  15. 基于JavaWeb的餐厅点餐系统设计与实现
  16. 远程服务器挂机好吗,什么服务器挂机好
  17. 关于Arcgis这62个常用技巧,你造吗
  18. 华硕vm510l装固态硬盘_华硕VM510L拆机换固态硬盘
  19. Visual C++游戏编程基础之多背景循环动画
  20. 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车

热门文章

  1. 能推荐给我一些免费看文学作品的网站吗?
  2. 数字电子技术基础课后题答案204页 4.18 4.21题-Ss1Two
  3. 鸿蒙应用:多设备闹钟开发教程(1)
  4. [附源码]java毕业设计乡村振兴惠农推介系统
  5. coreldraw什么做脚踏车_空中脚踏车怎么做才瘦腿
  6. 像素射击服务器维护公告图片,《我的勇者》11月29日更新公告
  7. python处理钉钉回调事件中的消息体加解密
  8. 使用adobe acrobat为PDF插入空白页
  9. 2023年六西格玛培训机构哪家最好?
  10. 前端与移动开发-----CSS(emmet 语法+CSS 复合选择器+元素的显示模式)