ORB算法特征提取

2024-06-15 14:52
文章标签 算法 特征提取 orb

本文主要是介绍ORB算法特征提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:学习过程中的知识总结,欢迎批评指正。

ORB算法提取两路输入图像(图像A,图像B)的特征点,根据提取的特征点进行特征匹配得到特征对。

图像金字塔

因为在现实世界中,同一个物体可能会以不同的尺度出现在图像中。例如,当你走近一个物体时,它在图像中的尺度就会变大;当你远离一个物体时,它在图像中的尺度就会变小。而且在双目视角中同一物体的尺度也是不一样的,为了让特征点检测算法能够在不同尺度的图像中都能有效地检测到特征点,需要使用图像金字塔。图像金字塔是由原始图像(称为第0层Level0)经过多次下采样得到的,在每一层上重新运行特征点提取算法或者根据缩放因子把第0层的特征点均摊到其它层,这样,我们就可以在不同尺度的图像中都检测到特征点,从而实现尺度不变性。

计算FAST角点

  1. 选取像素p,假设它的亮度为Ip
  2. 设置一个阈值T(这个阈值指的是亮度差)
  3. 以像素p为中心,选取半径为3的圆上的16个像素点
  4. 假设在这个圆上,有连续N个点的亮度大于Ip+T或小于Ip-T,那么像素p就被认为是特征点
  5. 循环上面几步,对每个像素都执行相同操作

可以理解成用一个7×7的卷积核,把图像进行遍历。

四叉树均匀化

通过四叉树均匀化把每层图像中的特征点的分布调整的更加均匀一些,在图像处理和计算机视觉中,特征点的分布往往会影响到后续算法的性能。如果特征点集中在图像的某一部分,那么这可能会导致对图像其他部分的信息损失,从而影响到后续算法的精度。

四叉树均匀化步骤:

  1. 将图像分割成四个等大小的区域(也就是四叉树的根节点)。
  2. 在每个区域中选择一定数量的特征点。如果某个区域中的特征点数量超过了预设的阈值,那么就继续将这个区域分割成四个子区域,并在每个子区域中选择特征点。
  3. 重复上述过程,直到所有的区域中的特征点数量都不超过阈值,或者达到了预设的最大深度。

BRIEF、ORB描述子

BRIEF算法的核心思想就是在特征点P周围以一定模式选取N个点对,比较点对的两个点(比如p,q)所在的灰度值大小:如果p比q大,则取1,反之取0。如果取了256个这样的p,q,就会得到256维由0,1组成的向量,而这个向量就是这个点的唯一表示,就可以称之为描述子。通过上述步骤我们得到了图像A和图像B的图像金字塔以及每一层中均匀分布的特征点,然后对这些特征点进行BRIEF描述子计算。FAST角点是没有方向信息的,那么在图像发生旋转的时候,其描述子也会发生变化,为了是的特征点具有旋转不变形,引出了灰度质心法来计算特征点的方向。

Steer BRIED描述子:上面所说的BRIEF算法,在将图像旋转后,描述子就会发生变化,为了使得描述子对旋转鲁棒,提出了灰度质心法(这个原理在下面讲解)具体做法就是将固定的pattern进行坐标转换,转换的坐标就是灰度质心法求解的向量作为x轴所在的坐标系,然后用转换后的pattern坐标下所在的像素进行对比,同样会得到唯一的描述子。如下图所示,Q就是灰度质心,坐标转换成PQ是x轴的坐标系:

BRIEF描述子的计算过程如下:

  1. 首先,选取特征点周围的一个小区域,通常是一个正方形区域。
  2. 然后,在这个区域内随机选择一对像素,计算它们的灰度值差。
  3. 如果灰度值差大于0,那么在BRIEF描述子中对应的位置为1,否则为0。
  4. 重复上述过程,直到得到一个足够长的二进制向量。通常,BRIEF描述子的长度可以是128、256或512。

ORB(Oriented FAST and Rotated BRIEF)描述子是在BRIEF的基础上加入旋转不变性的。这是通过引入特征点的方向信息来实现的。

具体的步骤:

  1. 特征点检测:ORB使用FAST角点检测器来找到图像中的特征点。
  2. 计算特征点的方向:对于每个关键点,ORB计算其周围像素的质心,然后计算特征点到质心的向量,该向量的角度就是特征点的方向。具体来说,如果图像中的点为𝑝(𝑥,𝑦),其强度质心为𝐶,则角度𝜃可以通过下面的公式计算:其中,𝑝是特征点周围的像素,𝐶是这些像素的质心,𝑥和𝑦是像素的坐标。
  3. 生成旋转不变的BRIEF描述子:在生成BRIEF描述子的时候,ORB考虑了特征点的方向。具体来说,它根据特征点的方向,将比较的像素对进行旋转,然后再比较它们的灰度值。这样生成的BRIEF描述子就具有旋转不变性了。

非极大值抑制

在特征点检测和描述子生成的过程中,非极大值抑制(Non-Maximum Suppression,NMS)是一个常用的步骤,用于减少冗余的特征点,并保留最显著的特征点。这在处理大量图像数据时是非常重要的,因为它可以显著减少计算量和存储需求。

特别是在特征点检测阶段,我们通常会得到大量的候选特征点,其中许多可能是相互非常接近或者在某种程度上是冗余的。非极大值抑制就是在这些候选特征点中选择最显著的特征点。通常,这是通过比较每个特征点与其邻域内其他特征点的响应值来实现的。只有当一个特征点的响应值大于其所有邻域内的其他特征点时,我们才保留这个特征点。

然而,对于特征点的主方向的计算,非极大值抑制并不常用。主方向的计算通常是基于特征点周围像素的梯度方向和大小,通过形成一个方向直方图,然后找到直方图的峰值来确定的。这个过程并不涉及非极大值抑制。但在某些算法中,可能会在计算主方向后再次使用非极大值抑制,以进一步减少特征点的数量。

特征点匹配

对同一层中的特征点进行特征匹配得到特征对,然后把每一层得到的特征对都叠加到第0层,再到一连串完整的特征对。

  1. 特征描述子计算:对每个特征点,计算其特征描述子。这可以使用BRIEF、SIFT、SURF、ORB等方法。
  2. 特征描述子比较:计算两个图像中所有特征描述子之间的距离。这通常使用欧氏距离或汉明距离,取决于特征描述子的类型,如果是使用具有旋转不变性的描述子计算方法,那么可以通过汉明距离来比较他们之间的距离。
  3. 匹配:根据特征描述子之间的距离,找到最相似的特征点对。常用的策略有最近邻匹配(Nearest Neighbor matching)和比值测试(Ratio Test)。最近邻匹配是找到距离最近的特征点对,而比值测试是找到第二近的特征点,并计算最近和第二近的距离比值,如果这个比值小于某个阈值(如0.8),则认为这是一个好的匹配。
  4. 剔除错误匹配:由于噪声和其他因素的影响,可能会产生一些错误的匹配。因此,通常需要使用一些方法来剔除这些错误的匹配,如RANSAC(RANdom SAmple Consensus)算法。

这篇关于ORB算法特征提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063774

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/