【图像处理】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 进行图像匹配
相关文章:

【图像处理】SIFT角点特征提取原理
一、说明 提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有: Harris & Stephens / Shi–Tomasi 角点…...

flutter开发实战-应用更新apk下载、安装apk、启动应用实现
flutter开发实战-应用更新apk下载、安装apk、启动应用实现 在开发过程中,经常遇到需要更新下载新版本的apk文件,之后进行应用更新apk下载、安装apk、启动应用。我们在flutter工程中实现下载apk,判断当前版本与需要更新安装的版本进行比对判断…...
DispatcherServlet初始化之Spring容器创建1.0
一、前言 在SpringMVC框架中,DispatcherServlet扮演着非常重要的角色,它负责接收所有的HTTP请求并将其分发给相应的处理器。在DispatcherServlet的初始化过程中,会创建一个Spring容器来管理应用程序中的Bean。 二、步骤 1、加载配置文件&a…...
CSS的基础
CSS美化HTML,布局网页 CSS最大的价值:由HTML专注去做结构呈现,样式给CSS,结构(HTML)与样式(CSS)相分离 CSS主要由选择器以及一条或多条声明 在<head></head>中实现CSS在<body…...

mathtype如何嵌入到word中?详细mathtype安装步骤教程
mathtype是一款功能特别强大的数学方式编辑软件,为用户提供各种强大的数学公式符号帮助用户进行计算,并且速度很快。有小伙伴知道mathtype如何嵌入到word中吗,这里小编就给大家详细介绍一下mathtype嵌入到word中的方法,有需要的小…...

云安全之访问控制的常见攻击及防御
访问控制攻击概述 访问控制漏洞即应用程序允许攻击者执行或者访问某种攻击者不具备相应权限的功能或资源。 常见的访问控制可以分为垂直访问控制、水平访问控制及多阶段访问控制 (上下文相关访问控制),与其相应的访问控制漏洞为也垂直越权漏洞(普通用户可以访问或…...

Java编程技巧:跨域
目录 1、跨域概念2、后端CORS(跨域资源共享)配置原理3、既然请求跨域了,那么请求到底发出去没有?4、通过后端CORS(跨域资源共享)配置解决跨域问题代码4.1、SpringBoot(FilterRegistrationBean&a…...

react create-react-app 配置less
环境信息: create-react-app:v5 react:18.2.0 node:18.16.0 如果你不必须使用 less 建议直接使用scss。 因为less配置会遇到很多问题。 配置less过程: 如果你只需要 sass的话,就可以直接使用sass。因为默认配置了scss。 npm、yarn、cnpm、…...

树的表示——孩子兄弟表示法
从图中可以看出,树的每个结点,都有不确定的指向他们的孩子的节点,如果我们定义这样一个结构体来便是数的结构的话: struct TreeNode { int val; struct TreeNodep1; struct TreeNodep1; … }; 是不能够表示一棵树的,因…...

Windows11安装MySQL8.1
安装过程中遇到任何问题均可以参考(这个博客只是单纯升级个版本和简化流程) Windows安装MySQL8教程-CSDN博客 到官网下载mysql8数据库软件 MySQL :: Download MySQL Community Server 下载完后,解压到你需要安装的文件夹 其中的配置文件内容了如下 [mysqld]# 设置3306端口po…...
Linux编程——经典链表list_head
1. 关于list_head struct list_head是Linux内核定义的双向链表,包含一个指向前驱节点和后继节点的指针的结构体。其定义如下: struct list_head {struct list_head *next, *prev; //双向链表,指向节点的指针 };1.1 链表的定义和初始化 有两…...

基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
基于51单片机NEC协议红外遥控发送接收仿真设计 讲解视频1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机NEC协议红外遥控发送接收仿真设计 51单片机红外发送接收仿真设计( proteus仿真程序原理图报告讲解视频…...

Jmeter分布式压力测试
目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时,单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…...
Rust :mod.rs和lib.rs中use的作用
一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式; lib.rs是一个库或子库层次综合在一起的有效方式; 下面举个实例来说明。生成一个rusttoc本地库(由cargo new rusttoc --lib所生成),目录…...

ISP图像信号处理——平场校正介绍以及C++实现
参考文章1:http://t.csdn.cn/h8TBy 参考文章2:http://t.csdn.cn/6nmsT 参考网址3:opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正;再用PRNU(Photo Response Non Uniformity)…...

【深入了解Java String类】
目录 String类 常用方法 字符串的不可变性 String的内存分析 StringBuilder类 解释可变和不可变字符串 常用方法 面试题:String,StringBuilder,StringBuffer之间的区别和联系 String类的OJ练习 String类 【1】直接使用,…...

基于SpringBoot的知识管理系统
目录 前言 一、技术栈 二、系统功能介绍 用户管理 文章分类 资料分类 文章信息 论坛交流 资料下载 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个…...
Pytorch基础:Tensor的reshape方法
在Pytorch中,reshape是Tensor的一个重要方法,它与Numpy中的reshape类似,用于返回一个改变了形状但数据和数据顺序和原来一致的新Tensor对象。注意:此时返回的数据对象并不一定是新的,这取决于应用此方法的Tensor是否是…...

【数据库——MySQL】(13)过程式对象程序设计——存储函数、错误处理以及事务管理
目录 1. 存储函数2. 存储函数的应用3. 错误处理4. 抛出异常5. 事务处理6. 事务隔离级7. 应用实例参考书籍 1. 存储函数 要 创建 存储函数,需要用到 CREATE 语句: CREATE FUNCTION 存储函数名([参数名 类型, ...])RETURNS 类型[存储函数体]注意࿱…...

Spring Boot的魔法:构建高性能Java应用
文章目录 Spring Boot:简化Java开发Spring Boot的性能优势1. 内嵌服务器2. 自动配置3. 起步依赖4. 缓存和优化5. 异步处理 实际示例:构建高性能的RESTful API总结 🎉欢迎来到架构设计专栏~Spring Boot的魔法:构建高性能Java应用 ☆…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...