SIFT/SURF算法

1 SIFT算法

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

1.1 基本流程

将SIFT算法分解为如下四步:
1.尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。

2.关键点定位︰在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于
它们的稳定程度。

3.关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。

4.关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

1.2 尺度空间极值检测

在不同的尺度空间使用不同的窗口检测极值点,对小的关键点使用小的窗口,对大的关键点使用大的窗口,为了达到上述目的,我们使用尺度空间滤波器。

1.3关键点定位

由于DoG对噪声和边缘比较敏感,因此在上面高斯差分金字塔中检测到的局部极值点需经过进一步的检验才能精确定位为特征点。
使用尺度空间的泰勒级数展开来获得极值的准确位置,如果极值点的灰度值小于阈值(一般为0.03或0.04)就会被忽略掉。在 OpenCV中这种阈值被称为contrastThreshold。
DoG算法对边界非常敏感,所以我们必须要把边界去除。Harris算法除了可以用于角点检测之外还可以用于检测边界。从 Harris 角点检测的算法中,当一个特征值远远大于另外一个特征值时检测到的是边界。那在DoG算法中欠佳的关键点在平行边缘的方向有较大的主曲率,而在垂直于边缘的方向有较小的曲率,两者的比值如果高于某个阈值(在OpenCV中叫做边界阈值),就认为该关键点为边界,将被忽略,一般将该阈值设置为10。
将低对比度和边界的关键点去除,得到的就是我们感兴趣的关键点。

1.4 关键点方向确定

经过上述两个步骤,图像的关键点就完全找到了,这些关键点具有尺度不变性。为了实现旋转不变性,还需要为每个关键点分配一个方向角度,也就是根据检测到的关键点所在高斯尺度图像的邻域结构中求得一个方向基准。

完成关键点梯度计算后,使用直方图统计关键点邻域内像素的梯度幅值和方向。具体做法是,将360°分为36柱,每10°为一柱,然后在以r为半径的区域内,将梯度方向在某一个柱内的像素找出来,然后将他们的幅值相加在一起作为柱的高度。

1.5 关键点描述

通过以上步骤,每个关键点就被分配了位置,尺度和方向信息。接下来我们为每个关键点建立一个描述符,该描述符既具有可区分性,又具有对某些变量的不变性,如光照,视角等。而且描述符不仅仅包含关键点,也包括关键点周围对其有贡献的的像素点。主要思路就是通过将关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对图像信息进行抽象。

1.6 总结

SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在实时性不高,有时特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷,自SIFT算法问世以来,人们就一直对其进行优化和改进,其中最著名的就是SURF算法。

1.7 SURF原理

使用SIFT算法进行关键点检测和描述的执行速度比较慢,需要速度更快的算法。2006年Bay提出了
SURF算法,是SIFT算法的增强版,它的计算量小,运算速度快,提取的特征与SIFT几乎相同,将其与SIFT算法对比如下:

2 算法实现

在OpenCV中利用SIFT检测关键点的流程如下所示:

  1. 实例化sift

sift = cv.xfeatures2d.SIFT_create()

  1. 利用sift.detectAndCompute()检测关键点并计算

kp,des=sift.detectAndCompute(gray,None)

参数:

  • gray:进行关键点检测的图像,用灰度图像

返回:

  • kp:关键点信息,包括位置,尺度,方向信息
  • des:关键点描述符,每个关键点对应128个梯度信息的特征向量

3 将关键点检测结果绘制在图像上

cv.drawKeypoints(image,keypoints,outputimage,color,flags)

参数:

  • image:原始图像

  • keypoints:关键点信息,将其绘制在图像上

  • outputimage:输出图片,可以是原始图像

  • color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色

  • flags:绘图功能的标识设置
    1.cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
    2.cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像
    上绘制匹配对
    3.cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
    4.cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

SURF算法的应用与上述流程是一致的

示例:利用SIFT算法检测图片关键点,并绘制出来:

import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread("../image/yy.jpg")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# sift关键点检测
# 1 实例化sift对象
sift = cv.xfeatures2d.SIFT_create()
# 2 关键点检测:kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
kp,des = sift.detectAndCompute(gray,None)
# 3 在图像上绘制关键点的检测结果
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)plt.figure(figsize=(8,6),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title("sift检测")
plt.show()

注:以上数据来自b站黑马程序员视频,点击跳转

SIFT/SURF算法相关推荐

  1. SIFT/SURF算法的作用

    转自:https://blog.csdn.net/cy513/article/details/4414352 SURF算法是SIFT算法的加速版,opencv的SURF算法在适中的条件下完成两幅图像中 ...

  2. 十一、opencv-python图像处理顶级操作(3)——SIFT/SURF算法

    文章目录 一.SIFT原理 1.基本流程 2.尺度空间极值检测 3.关键点定位 4.关键点方向确定 5.关键点描述 6.总结 二.SURF原理 总结 一.SIFT原理  Harris和Shi-Toma ...

  3. 物体识别算法——SIFT/SURF、haar特征、广义hough变换的对比分析

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:cvvision 链接:http://www.cvvision.cn/7780.html 来源:CV视觉网 识别算法概述: ...

  4. 图像特征提取与描述_角点特征02:SIFT算法+SURF算法

    SIFT/SURF算法 1.1 SIFT原理 前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但 ...

  5. 图像局部特征(八)--斑点检测子SIFT/SURF区别总结

    原文: http://blog.csdn.net/cy513/article/details/4414352 http://blog.csdn.net/jwh_bupt/article/details ...

  6. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  7. SIFT,SURF,ORB,FAST 特征提取算法比较

    SIFT,SURF,ORB,FAST 特征提取算法比较 主要的特征检测方法有以下几种,在一般的图像处理库中(如OpenCV, VLFeat, Boofcv等)都会实现. FAST ,Machine L ...

  8. 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析

    识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...

  9. SIFT,SURF,ORB,FAST,BRISK 特征提取算法比较

    SIFT,SURF,ORB,FAST 特征提取算法比较 图像处理的基础就是要进行特征点的提取,feature(interest points) detect 的方法也在不断的进步,边检测,角点检测,直 ...

  10. [转]SIFT,SURF,ORB,FAST 特征提取算法比较

    转载地址:https://blog.csdn.net/vonzhoufz/article/details/46461849 主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLF ...

最新文章

  1. 基于全景图像与激光点云配准的彩色点云生成算法(2014年文章)
  2. HashTab---Windows资源管理器的文件属性窗口中添加了一个叫做”文件校验”的标签...
  3. 解决docker pull 速度慢问题
  4. js动态给当前点击元素添加css类
  5. mysql 浮点数定义2_MySQL学习笔记(二):数据类型
  6. 【MySQL】时区设置引发的卡顿
  7. 详谈ARM架构与ARM内核发展史
  8. 第三方依赖关系的风险:利用数十个易受攻击的 NuGet包瞄准 .NET 平台
  9. 「SCOI2015」小凸玩密室 解题报告
  10. 安卓rom制作教程_【教程】给ROM制作一个卡刷补丁包
  11. android 平板刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机
  12. 2022华为杯数学建模A题思路代码
  13. Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?
  14. ev3编程变量模块_【EV3基础编程 第八课】升阶学习难度,一对一个性化控制程序,变量来了...
  15. 原创科幻短篇《高考》
  16. 如何提高思维能力和逻辑能力?
  17. MATLAB画哆啦A梦
  18. 如何解决iOS设备AppStore下载一直是正在载入中
  19. 数据结构 :: 顺序栈与链式栈的设计与实现
  20. Word Embeddings 学习笔记

热门文章

  1. BWA关于Unmatched SAI magic. Please re-run `aln' with the same version of bwa.
  2. 三菱plc pwm指令_三菱plc功能指令集大全和自学基础
  3. 二元函数的洛必达法则
  4. IIS管理器FTP站点中FTP防火墙支持页面
  5. windows10安装masscan
  6. 【愚公系列】2022年09月 微信小程序-电商项目-UI框架的选型
  7. 3dsMax建模,卡线学习笔记
  8. 搜罗到一个简洁、支持免费听和下载全网音乐的网站
  9. 【Mybatis】TKMybatis 介绍和使用
  10. Teststand中那些和LabVIEW里不一致的让人疑惑的规则