在SIFT中,Lowe用高斯差近似高斯的拉普拉斯算子来寻找尺度空间。SURF走得更远,使用Box Filter近似LoG。下图显示了这种近似值的演示。这种近似的一大优点是,借助积分图像可以轻松地计算出带盒滤波器的卷积。并且可以针对不同规模并行执行。SURF还依赖于Hessian矩阵的行列式来确定尺度和位置。

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

对于功能描述,SURF在水平和垂直方向上使用小波响应(同样,使用积分图像使事情变得更容易)。在s是大小的关键点周围采用大小为20sX20s的邻域。它分为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∣|dx|∣dx∣的和分别针对dy<0dy<0dy<0和dy≥0dy≥0dy≥0进行计算。同样,dydydy和∣dy∣|dy|∣dy∣的总和 根据dxdxdx的符号进行拆分,从而使特征数量加倍。它不会增加太多的计算复杂性。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相同。

img = cv.imread('fly.png',0)
# 创建SURF对象。你可以在此处或以后指定参数。
# 这里设置海森矩阵的阈值为400
>>> surf = cv.xfeatures2d.SURF_create(400)
# 直接查找关键点和描述符
>>> kp, des = surf.detectAndCompute(img,None)
>>> len(kp)699

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

# 检查海森矩阵阈值
>>> print( surf.getHessianThreshold() )
400.0
# 我们将其设置为50000。记住,它仅用于表示图片。
# 在实际情况下,最好将值设为300-500
>>> surf.setHessianThreshold(50000)
# 再次计算关键点并检查其数量。
>>> kp, des = surf.detectAndCompute(img,None)
>>> print( len(kp) )
47

它小于50。让我们在图像上绘制它。

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

您可以看到SURF更像是斑点检测器。它检测到蝴蝶翅膀上的白色斑点。您可以使用其他图像进行测试。

# 检查flag标志,如果为False,则将其设置为True
>>> print( surf.getUpright() )
False
>>> surf.setUpright(True)
# 重新计算特征点并绘制
>>> kp = surf.detect(img,None)
>>> img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4)
>>> plt.imshow(img2),plt.show()

所有的方向都显示在同一个方向上。它比以前更快了。如果你工作的情况下,方向不是一个问题(如全景拼接)等,这是更好的。

最后,我们检查描述符的大小,如果只有64维,则将其更改为128。

# 找到算符的描述
>>> print( surf.descriptorSize() )
64
# 表示flag “extened” 为False。
>>> surf.getExtended()False
# 因此,将其设为True即可获取128个尺寸的描述符。
>>> surf.setExtended(True)
>>> kp, des = surf.detectAndCompute(img,None)
>>> print( surf.descriptorSize() )
128
>>> print( des.shape )
(47, 128)

其余部分是匹配的。

python-opencv图像处理之SURF函数相关推荐

  1. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  2. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  3. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  4. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  5. Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...

  6. python+opencv图像处理之边缘检测车道线识别

    python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...

  7. Python OpenCV图像处理 理论 代码

    python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...

  8. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  9. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  10. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

最新文章

  1. Integer 和 int 比较的特殊之处
  2. C++ 第五课:C/C++ 数据类型
  3. 将 app 打包成 deb 发布安装
  4. java 异常处理发生异常_处理Java中的异常
  5. 关于nutz跨服务器上传文件
  6. php标签扩展,标签扩展 · ThinkPHP5.0完全开发手册 · 看云
  7. 学会用感情营销是最高的智慧
  8. uwsgi模式_uWSGI / Pylons的开发模式(重新加载新代码)
  9. 转:前端js、jQuery实现日期格式化、字符串格式化
  10. 绑架、做空、造假…是谁搞垮了曾经的“网红公司”网秦?
  11. 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件
  12. [Android][sensor]物理sensor bring up流程
  13. Dart factory 快速理解
  14. html中关于侧边导航栏和导航栏的编写
  15. 简单分布式锁实现(拍黄片)
  16. 读书笔记好记性不如烂笔头
  17. 云时代架构系列经典技术书籍
  18. 从今天开始学习python和英语
  19. REAL-TIME RENDER 4th Chapter 23 Graphics Hardware
  20. 自动化_零基础学习QTP视频教程

热门文章

  1. 作者:周宗放(1950-),男,电子科技大学经济与管理学院教授、博士生导师,风险分析与数据科学研究中心主任...
  2. 【计算机组成原理】CPU
  3. LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  4. Python全栈开发之并发编程
  5. activiti-explorer 启动报错 Error creating bean with name 'demoDataConfiguration'
  6. asp教程七:包含文件
  7. 网络安全案例研究:“神秘”的加密指纹
  8. Android 一个Activity 里面放置多个 Fragment 实现点击切换的Tab 页面效果
  9. [Mechine Learning Algorithm] 集成学习方法——Bagging和 Boosting
  10. HTML里面Textarea换行总结