【图像处理】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.xdnf.cn/news/144596.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

支付宝电脑网站支付,异步通知

一&#xff1a;异步通知是支付宝回调商户的服务器&#xff0c;所以这个地址需要通过外网访问&#xff0c;在真实项目中都会有对应的服务器&#xff0c;但是在测试中只有使用内网穿透工具 推荐使用NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 配置好内网穿透之后不要忘记…

CIP或者EtherNET/IP中的PATH是什么含义?

目录 SegmentPATH举例 最近在学习EtherNET/IP&#xff0c;PATH不太明白&#xff0c;翻了翻规范&#xff0c;在这里记个笔记。下面的叙述可能是中英混合&#xff0c;有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…

PHP8的继承和多态-PHP8知识详解

我们在前面的时候讲过《面向对象编程的特点》时&#xff0c;面向对象编程具有3大特点&#xff1a;封装性、继承性和多态性。 继承和多态的根本作用就是完成代码的重用。下面就来讲解php8的继承和多态。 1继承 子类可以继承父类的所有成员变量和成员方法&#xff0c;包括构造方…

数据集笔记: Porto

数据来源&#xff1a;Taxi Trajectory Data_数据集-阿里云天池 (aliyun.com) 1 数据介绍 葡萄牙波尔图市运行的所有442辆出租车的全年轨迹&#xff08;从2013年7月1日至2014年6月30日&#xff09; 2 读取数据 import pandas as pdtrapd.read_csv(C:/Users/16000/Download…

【EasyExcel】excel表格的导入和导出

【EasyExcel】excel表格的导入和导出 【一】EasyExcel简介【二】EasyExcel使用【1】EasyExcel相关依赖【2】写Excel&#xff08;1&#xff09;最简单的写(方式一)&#xff08;2&#xff09;最简单的写(方式二)&#xff08;3&#xff09;排除模型中的属性字段&#xff08;4&…

Springboot对MVC、tomcat扩展配置

Springboot在web层的开发基本都是采用Springmvc框架技术&#xff0c;但是Springmvc中的某些配置在boot是没有的&#xff0c;我们就应该根据自己的需求进行对mvc扩展配置 Springboot1.x版本如何配置 通过注解Configuration一个类&#xff0c;继承webmvcconfigureradapter&#…

Bootstrap的弹性盒子布局学习笔记

Bootstrap的弹性盒子布局学习笔记 目录 01-综述02-利用类d-flex与类d-inline-flex将容器定义为弹性盒子03-对弹性容器的的元素在水平方向上进行排列顺序设置03-对弹性容器的的元素在垂直方向上进行排列顺序设置04-弹性盒子内所有元素在主轴方向上的对齐方式05-1-弹性盒子内各行…

C#生成自定义海报

安装包 SixLabors.ImageSharp.Drawing 2.0 需要的字体&#xff1a;宋体和微软雅黑 商用的需要授权如果商业使用可以使用方正书宋、方正黑体&#xff0c;他们可以免费商用 方正官网 代码 using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Draw…

redis-设置从节点

节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时&#xff0c;会触发同步数据命令 主节点…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

insightface实战:画出嘴巴和眼睛的mask

今天的目标是将人脸的嘴巴和眼睛区域抠出来&#xff0c;使用insightface简单实现出来&#xff0c;为了方便批量使用多进程跑数据&#xff0c;使用多进程的方式&#xff0c;下面是代码&#xff1a; import os import cv2 from multiprocessing import Pool import numpy as n…

Visual Studio 2019 C# winform CefSharp 中播放视频及全屏播放

VS C# winform CefSharp 浏览器控件&#xff0c;默认不支持视频播放&#xff0c;好在有大佬魔改了dll&#xff0c;支持流媒体视频播放。虽然找了很久&#xff0c;好歹还是找到了一个版本100.0.230的dll&#xff08;资源放在文末&#xff09; 首先创建一个项目 第二、引入CefSha…

排序:归并(Merge)排序算法分析

1.归并操作 归并:把两个或多个已经有序的序列合并成一个。 2路归并&#xff1a;二合一k路归并&#xff1a;k合一结论:m路归并&#xff0c;每选出一个元素需要对比关键字m-1次。 2.算法思想 核心操作:把数组内的两个有序序列归并为一个。 例如&#xff1a; 3.代码实现 将…

什么是大数据可视化

在互联网高速发展的当今&#xff0c;5G的兴起加速了数据传输的速度&#xff1b;与此同时&#xff0c;智能物联网如智慧家电、可穿戴设备等产品的火热&#xff0c;进一步扩充了数据获取的渠道。不仅仅在网页上、手机和电脑应用上以秒计产生海量数据&#xff0c;智能设备同时也在…

04. 人工智能核心基础 - 导论(3)

文章目录 人工智能和其他学科的关系为什么学习人工智能怎么学好人工智能&#xff1f;一些问题 Hi&#xff0c;你好。我是茶桁。 基于上一节课咱们的整体强度有点大&#xff0c;而且咱们马上也要进入高强度内容了&#xff0c;那么这一篇咱们就稍微水一篇吧。来聊聊天&#xff0…

Nginx环境搭建、负载均衡测试

Nginx环境搭建、负载均衡测试 系统环境&#xff1a; win10&#xff0c;IDEA2020&#xff0c;JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载&#xff1a; http://nginx.org/en/download.html Nginx有三种版本&#xff0c;分别是Mainline version&#xff08;开发版&…

怒刷LeetCode的第19天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;遍历一次数组 方法二&#xff1a;贪心算法 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;贪婪算法 方法三&#xff1a;正则表达式 第…

玄子Share 设计模式 GOF 全23种 + 七大设计原则

玄子Share 设计模式 GOF 全23种 七大设计原则 前言&#xff1a; 此文主要内容为 面向对象七大设计原则&#xff08;OOD Principle&#xff09;GOF&#xff08;Gang Of Four&#xff09;23种设计模式拓展的两个设计模式 简单工厂模式&#xff08;Simple Factory Pattern&#x…

基于Java实现的仓库管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言功能介绍&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导…

解密PDF密码

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…