【图像处理】SIFT角点特征提取原理

一、说明

        提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有:

  • Harris & Stephens / Shi–Tomasi 角点检测算法
  • Förstner角点检测器;
  • 多尺度 Harris 算子
  • 水平曲线曲率法
  • 高斯的拉普拉斯、高斯的差异和 Hessian 尺度空间兴趣点的行列式
  • 基于 Lindeberg Hessian 特征强度度量的尺度空间兴趣点
  • 仿射自适应兴趣点算子
  • Wang 和 Brady 角点检测算法
  • SUSAN 角点检测器
  • Trajkovic 和 Hedley 角点检测器
  • 基于 AST 的特征检测器
  • 检测器自动合成
  • 时空兴趣点检测器

二、快速(来自加速段测试的功能)

        FAST是一种用于识别图像中的兴趣点的算法。兴趣点具有较高的本地信息含量,理想情况下,它们应该在不同图像之间可重复。FAST算法工作背后的原因是开发一种兴趣点检测器,用于实时帧速率应用,如移动机器人上的SLAM,这些应用的计算资源有限。

        算法如下:

  • 在强度IP的图像中选择一个像素“p‟”。这是要标识为兴趣点的像素。
  • 设置阈值强度值 T。
  • 考虑围绕像素 p 的 16 像素圆圈。
  • 如果需要将 16 个像素检测为兴趣点,则 <> 个连续像素中的“N”个连续像素需要高于或低于值 T。
  • 为了使算法快速,首先将圆的像素 1、5、9 和 13 的强度与 IP 进行比较。从上图中可以明显看出,这四个像素中至少有三个应该满足阈值标准,以便存在兴趣点。
  • 如果四个像素值中的至少三个 — I1 、I5 、I9 I13 不高于或低于 IP + T,则 P 不是兴趣点(角)。在这种情况下,我们拒绝像素 p 作为可能的兴趣点。否则,如果至少三个像素高于或低于 Ip + T,则检查所有 16 个像素。
  • 对图像中的所有像素重复此过程。

2.1 机器学习方法

  • 选择一组图像进行训练,运行FAST算法检测兴趣点

  • 对于每个像素“p‟”,将其周围的 16 个像素存储为向量,并对所有像素重复此操作
  • 现在这是向量 P,它包含所有用于训练的数据。
  • 向量中的每个值都可以采用三种状态。比 p 暗,比 p 亮或与 p 相似。
  • 根据状态的不同,整个向量P将细分为三个子集,Pd,Ps,Pb。
  • 定义一个变量 Kp,如果 p 是兴趣点,则为 true,如果 p 不是兴趣点,则为 false。
  • 使用 ID3 算法(决策树分类器)使用变量 Kp 查询每个子集以获取有关真实类的知识。
  • ID3算法的工作原理是熵最小化。以这样一种方式查询 16 像素,以便以最少的查询数找到真正的类(兴趣点或非兴趣点)。或者换句话说,选择像素x,它具有有关像素的最多信息

  • 递归地将此熵最小化应用于所有三个子集。
  • 当子集的熵为零时终止进程。
  • 决策树学习的这种查询顺序也可用于在其他图像中更快地检测。

2.2 用于移除相邻拐角的非最大抑制

        检测彼此相邻的多个兴趣点是该算法初始版本的其他问题之一。这可以通过在检测到兴趣点后应用非最大抑制来处理。我们为每个检测到的点计算一个评分函数 V。评分函数定义为:“连续弧中像素与中心像素之间的绝对差值之和”。我们比较两个相邻的值并丢弃较低的值。

三、简介 ( 二进制鲁棒独立基本特征 )

        BRIEF 提供了一个快捷方式,可以直接查找二进制字符串而无需查找描述符。它采用平滑的图像补丁,并以独特的方式选择一组nd(x,y)位置对(在论文中解释)。然后对这些位置对进行一些像素强度比较。例如,设第一个位置对为 p 和 q。如果 I(p) <I(q) ,则其结果为 1,否则为 0。这适用于所有 nd 位置对以获取 nd 维位串。此 nd 可以是 128、256 或 512。因此,一旦我们得到这个,我们就可以使用汉明距离来匹配这些描述符。

OpenCV中的简介

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate STAR detector
star = cv2.FeatureDetector_create("STAR")# Initiate BRIEF extractor
brief = cv2.DescriptorExtractor_create("BRIEF")# find the keypoints with STAR
kp = star.detect(img,None)# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)print brief.getInt('bytes')
print des.shape 

四、SIFT(尺度不变特征变换)

        它是一种检测图像中突出、稳定的特征点的技术。对于每个这样的点,它都提供了一组不变的旋转和缩放特征。

        SIFT算法有四个步骤:

•确定显著特征点(也称为关键点)的大致位置和比例

•优化其位置和规模

•确定每个关键点的方向。

•确定每个关键点的描述符。

五、大致位置

        SIFT算法使用高斯差,这是LoG的近似值。此过程针对高斯金字塔中图像的不同八度音阶完成。一旦找到此DoG,就会在比例和空间上搜索图像的局部极值。这基本上意味着关键点在该比例中得到最好的表示。

5.1 关键点本地化

        一旦找到潜在的关键点位置,就必须对其进行优化以获得更准确的结果。他们使用尺度空间的泰勒级数展开来获得更准确的极值位置,如果该极值的强度小于阈值(根据论文为0.03),则被拒绝。此阈值在 OpenCV 中称为 contrastThreshold

        DoG对边缘的响应更高,因此也需要去除边缘。为此,使用了类似于哈里斯角检测器的概念。他们使用2x2的Hessian矩阵(H)来计算主曲率。所以这里我们使用一个简单的函数:如果这个比率大于阈值,则该关键点将被丢弃。因此,它消除了任何低对比度的关键点和边缘关键点,剩下的就是强烈的兴趣点。

5.2 指定方向

        现在为每个关键点分配一个方向,以实现图像旋转的不变性。根据比例在关键点位置周围选取邻域,并在该区域计算梯度大小和方向。将创建具有 36 个箱(覆盖 360 度)的方向直方图。它由梯度幅度和高斯加权圆形窗口加权,σ等于关键点刻度的 1.5 倍。取直方图中的最高峰,任何高于 80% 的峰值也被认为是计算方向的。它创建具有相同位置和比例但方向不同的关键点。它有助于匹配的稳定性。

5.3 每个关键点的描述符

        现在,关键点描述符已创建。在关键点周围拍摄一个 16x16 的邻域。它分为 16 个 4x4 大小的子块。对于每个子块,创建一个 8 箱方向的直方图。它表示为向量以形成关键点描述符。除此之外,还采取了一些措施来实现对照明变化、旋转等的鲁棒性。

六、应用:匹配SIFT描述符

        通过识别其最近的邻居来匹配两个图像之间的关键点。但在某些情况下,第二个最接近的匹配可能非常接近第一个。这可能是由于噪音或其他一些原因而发生的。在这种情况下,将采用最近距离与第二近距离的比率。如果大于 0.8,则拒绝它们。它消除了大约 90% 的错误匹配,而只丢弃了 5% 的正确匹配。

        用于创建全景视图的 SIFT

OpenCV 中的 SIFT

import cv2
import numpy as npimg = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)sift = cv2.SIFT()
kp = sift.detect(gray,None)img=cv2.drawKeypoints(gray,kp)cv2.imwrite('sift_keypoints.jpg',img) 

七、SURF(加速 - 强大的功能)

        获取 SURF 描述符分为两个阶段,首先检测 SURF 点,然后在 SURF 点提取描述符。SURF点的检测利用了尺度空间理论。为了检测SURF点,使用快速黑森矩阵。黑森矩阵的行列式用于决定是否可以选择一个点作为兴趣点。在图像 I 中,点 X 处的 Hessian 矩阵由下式定义:

        在对图像执行卷积之前,需要对高斯二阶导数进行离散化。Dxx、Dyy 和 Dxy 表示框滤波器与图像的卷积。这些近似的二阶高斯导数计算是通过使用积分图像快速进行的。

        通过更改框过滤器的大小来分析图像的比例空间。通常,Box 滤波器以默认大小 9x9 开头,对应于 σ= 1.2 的高斯导数。过滤器大小稍后会放大到 15x15、21x21、27x27 等大小。在每个尺度上计算黑森矩阵的近似行列式,并应用 333 个邻域中的非极大抑制来求最大值。SURF 点的位置和比例 s 是用最大值获得的。

        获得的SURF点的方向使用Haar小波响应进行分配。在 SURF 点附近,即半径 6s 以内,在 x 和 y 方向上计算哈尔小波响应。使用这些响应,确定主要方向。在主导方向上,构建了一个以SURF点为中心的20s大小的正方形。这分为44个子区域。在这些子区域中,在55个规则放置的采样点处计算水平和垂直Haar小波响应dx和dy。这些响应以特定的区间相加,得到 Σdx , Σdy。此外,这些响应的绝对值以特定区间求和,得到 Σ|dx|, Σ|dy|.使用这些值,为每个子区域构造一个 4 维特征向量 V = (Σdx, Σdy, Σ|dx| , Σ|dy|)。因此,每个提取的 SURF 点都与一个 4x(4x4) 描述符相关联,该描述符是一个 64 维描述符。此 64 维描述符用于执行匹配操作。

八、ORB (定向快速和旋转简报)

        ORB基本上是FAST关键点检测器和BRIEF描述符的融合,并进行了许多修改以增强性能。首先,它使用 FAST 查找关键点,然后应用 Harris 角度量来查找其中的前 N 个点。它还使用金字塔来生成多尺度特征。

ORB的算法:

        它计算角位于中心的修补程序的强度加权质心。矢量从此角点到质心的方向给出了方向。为了提高旋转不变性,用 x 和 y 计算弯矩,它们应该在半径为 r 的圆形区域中,其中 r 是补丁的大小。现在对于描述符,ORB 使用 BRIEF 描述符。BRIEF是旋转不变的,因此ORB根据关键点的方向来操纵BRIEF。对于位置 xi,yi 处的 n 个二进制测试的任何特征集,定义一个 2 x n 矩阵 S,其中包含这些像素的坐标。然后利用贴片的方向θ,找到它的旋转矩阵,旋转S得到转向(旋转)版本Sθ。

        随着轮换的不变,BRIEF变得更加分散。ORB 在所有可能的二元检验中运行贪婪搜索,以找到方差高且均值接近 0.5 且不相关的检验。结果称为 rBRIEF。对于描述符匹配,使用了在传统LSH基础上改进的多探针LSH。

OpenCV 中的 ORB:

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate STAR detector
orb = cv2.ORB()# find the keypoints with ORB
kp = orb.detect(img,None)# compute the descriptors with ORB
kp, des = orb.compute(img, kp)# draw only keypoints location,not size and orientation
img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0)
plt.imshow(img2),plt.show() 

使用 ORB 进行图像匹配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试题】2023前端面试真题之JS篇

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 世界上只有一种真正的英雄主义&#xff0c;那就是看清生活的真相之后&#xff0c;依然热爱生活。…

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而&#xff0c;在研究中发现并继续探索的最令人惊讶的事情是&#xff0c;欺骗当前的网络安全防御是多么容易。 防病毒程序建立在庞大的签名数据库之上&#xff0c;只需更改程序内…

《The Rise and Potential of Large Language Model Based Agents: A Survey》全文翻译

The Rise and Potential of Large Language Model Based Agents: A Surve - 基于 LLMs 的代理的兴起和潜力&#xff1a;一项调查 论文信息摘要1. 介绍2. 背景2.1 AI 代理的起源2.2 代理研究的技术趋势2.3 为什么大语言模型适合作为代理大脑的主要组件 3. 代理的诞生&#xff1a…

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程(2)

几个月之前写的一个项目&#xff0c;通过这个项目&#xff0c;你能学到关于数据库的触发器知识&#xff0c;python的基本语法&#xff0c;python一些第三方库的使用&#xff0c;包括python如何将前后端连接起来&#xff08;界面和数据&#xff09;&#xff0c;还有界面的设计等…

神经辐射场(NeRF)2023最新论文及源代码合集

神经辐射场&#xff08;NeRF&#xff09;作为一种先进的计算机图形学技术&#xff0c;能够生成高质量的三维重建模型&#xff0c;在计算机图形学、计算机视觉、增强现实等领域都有着广泛的应用前景&#xff0c;因此&#xff0c;自2020年惊艳亮相后&#xff0c;神经辐射场也成为…

python安装第三方模块方法

正常情况下安装python第三方模块没啥说的&#xff0c;但是由于python安装模块默认是在外网下载安装&#xff0c;牵扯外网网速问题&#xff0c;所以可以配置下使用国内某镜像源来下载模块 python -m pip install xxxxxxxxxxx 和 pip install xxxxxxxxxx 的命令都可下载安装第三…

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…

李宏毅机器学习第一课(结尾附作业模型详细分析)

机器学习就是让机器找一个函数f&#xff0c;这个函数f是通过计算机找出来的 如果参数少的话&#xff0c;我们可以使用暴搜&#xff0c;但是如果参数特别多的话&#xff0c;我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification &#xff08;在…

【C++】C++入门

一、C 关键字&#xff08;C98&#xff09; C 总计 63 个关键字&#xff0c;C 语言 32 个关键字。C 语言的关键字在 C 中继续可以使用。 C 兼容 C 的绝大多数语法。 二、命名空间 在 C / C 中&#xff0c;变量、函数和类都是大量存在的&#xff0c;这些变量、函数和类的名称将都…

DVWA-impossible代码审计

本篇文章针对于DVWA靶场的impossible级别进行代码审计&#xff0c;基于DVWA的每一个漏洞的impossible级别&#xff0c;从整体思路上出发&#xff0c;进行代码审计&#xff0c;最后对其总结。从中可以学习到一些漏洞的防御手法&#xff0c;并且对漏洞有更深入的理解。 文章目录 …

led台灯哪个牌子最好?2022最新的台灯牌子排名

想要选好护眼台灯首先我们要知道什么是护眼台灯&#xff0c;大的方向来看&#xff0c;护眼台灯就是可以保护视力的台灯&#xff0c;深入些讲就是具备让灯发出接近自然光特性的光线&#xff0c;同时光线不会伤害人眼而出现造成眼部不适甚至是视力降低的照明设备。 从细节上看就…

Linux——补充点(页表映射及LWP)

目录 补充点1&#xff1a;进程地址空间堆区管理 补充点2&#xff1a;Linux内核进程上下文切换 补充点3&#xff1a;页表映射 补充点4&#xff1a;两级页表 补充点1&#xff1a;进程地址空间堆区管理 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程&#…

【Java 进阶篇】MySQL多表查询之外连接详解

在MySQL数据库中&#xff0c;多表查询是一种常见且强大的功能&#xff0c;允许您在多个表之间执行联接操作&#xff0c;从而检索、过滤和组合数据。在本篇博客中&#xff0c;我们将深入探讨多表查询的一种类型&#xff0c;即外连接&#xff08;Outer Join&#xff09;&#xff…

医疗小程序开发:技术门槛高?

随着移动互联网的普及&#xff0c;医疗行业也逐渐转向线上。医疗小程序开发成为了很多企业和医疗机构关注的焦点。但是&#xff0c;对于一些技术小白来说&#xff0c;可能会觉得医疗小程序开发技术门槛高&#xff0c;无从下手。实际上&#xff0c;使用乔拓云平台进入后台&#…

C理解(一):内存与位操作

本文主要探讨C语言的内存和为操作操作相关知识。 冯诺依曼结构和哈佛结构 冯诺依曼结构&#xff1a;数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是&#xff1a;数据和代码分开存放,安全性高,读取和修麻烦 内存 内存是用来存储全局变量、局…

Prometheus+Grafana监控K8S集群(基于K8S环境部署)

文章目录 一、环境信息二、部署前准备工作三、部署Prometheus监控系统四、部署Node_exporter组件五、部署Kube_state_metrics组件六、部署Grafana可视化平台七、Grafana可视化显示Prometheus收集数据八、Grafana添加监控模板九、拓展 一、环境信息 1、服务器及K8S版本信息&…

Nim游戏

891. Nim游戏 - AcWing题库 全部异或起来&#xff0c;如果不为零&#xff0c;则可以一步使其变为0&#xff1a; 设异或和为x&#xff0c;x的最高位为第k位&#xff0c;令第k位为1的a[i]变为a[i]^x&#xff0c;a[i]^x < a[i]&#xff0c;这样就可以使异或和为0。 如此往复最…

目标检测如何演变:从区域提议和 Haar 级联到零样本技术

目录 一、说明 二、目标检测路线图 2.1 路线图&#xff08;一般&#xff09; 2.2 路线图&#xff08;更传统的方法&#xff09; 2.3 路线图&#xff08;深度学习方法&#xff09; 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…

el-table实现穿梭功能

第一种 <template><el-row :gutter"20"><el-col :span"10"><!-- 搜索 --><div class"search-bg"><YcSearchInput title"手机号" v-model"search.phone" /><div class"search-s…

EasyX趣味化编程note2,绘制基本图形

创意化编程&#xff0c;让编程更有趣 今天介绍的仍为比较简单的效果&#xff0c;由浅入深来进行学习 介绍每个函数都会附上代码和运行结果&#xff0c;感兴趣的大家可以复制粘贴运行一下看看效果&#xff0c;也可以自己进行改动&#xff0c;非常好玩且加深印象。 上节课的知识…