当前位置: 首页 > news >正文

《计算机视觉》——角点检测和特征提取sift

角点检测

角点的定义

从直观上理解,角点是图像中两条或多条边缘的交点,在图像中表现为局部区域内的灰度变化较为剧烈的点。在数学和计算机视觉中,角点可以被定义为在两个或多个方向上具有显著变化的点。比如在一幅建筑物的图像中,建筑物的顶点就是典型的角点;在一张棋盘格的图像中,棋盘格的交点也属于角点。
在这里插入图片描述

角点检测的作用
  • 特征提取:角点是图像的重要特征之一,由于其具有独特的位置和局部特征,可用于图像的特征描述,便于后续的图像匹配、目标识别等操作。例如,在物体识别中,通过检测物体图像中的角点并与数据库中物体的角点特征进行匹配,从而识别出物体。
  • 图像配准:在将不同时间、不同视角或不同传感器获取的图像进行融合时,角点可以作为图像之间的对应点,帮助实现图像的精确配准。例如,在卫星图像拼接中,通过检测不同卫星图像中的角点并进行匹配,可以将多幅图像拼接成一幅完整的图像。
  • 运动跟踪:在视频序列中,通过跟踪角点的运动轨迹,可以分析物体的运动状态。比如在运动分析中,跟踪运动员身体上的角点,可以得到运动员的动作轨迹和运动参数。
常见的角点检测算法
  • Harris 角点检测算法:由 Chris Harris 和 Mike Stephens 在 1988 年提出。该算法基于图像局部的自相关函数,通过计算图像在各个方向上的灰度变化,得到一个角点响应函数 R。如果 R 的值超过一定的阈值,则认为该点是角点。Harris 角点检测算法具有旋转不变性,但对尺度变化比较敏感。
    Shi-Tomasi 角点检测算法:是对 Harris 角点检测算法的改进。该算法通过计算图像块的最小特征值来判断角点,相比于 Harris 算法,Shi-Tomasi 算法在角点检测的准确性上有了一定的提高,并且在目标跟踪等应用中表现更优。
  • SIFT(尺度不变特征变换)算法:不仅可以检测角点,还具有尺度不变性、旋转不变性和光照不变性等优点。SIFT 算法通过在不同尺度空间上检测极值点,并对这些极值点进行精确定位和描述,生成 128 维的特征向量,用于后续的特征匹配等操作。不过,SIFT 算法计算复杂度较高,运行速度较慢。
  • SURF(加速稳健特征)算法:是 SIFT 算法的加速版本,采用了积分图像和 Haar 小波特征,大大提高了算法的运行速度,同时也具有较好的尺度不变性和旋转不变性。在实际应用中,SURF 算法在处理速度和特征描述能力上取得了较好的平衡。
  • ORB(Oriented FAST and Rotated BRIEF)算法:结合了 FAST(Features from Accelerated Segment Test)角点检测算法和 BRIEF(Binary Robust Independent Elementary Features)特征描述子。FAST 算法用于快速检测角点,BRIEF 算法用于生成二进制特征描述子。ORB 算法具有计算速度快、内存占用小等优点,在实时性要求较高的应用中得到了广泛应用。

角点检测实例

对黄鹤楼的图片进行角点检测:
在这里插入图片描述

'''角点检测'''
import cv2
import numpy as np#角点指图像中局部区域与周围区域有较大灰度变化的点或像素。
# cornerHarris(img,blockSize,ksize,k[,dst[,borderType]])-> dst
# img:输入图像。
#blockSize:角点检测中要考虑的领域大小。
# ksize:Sobel求导中使用的日大小。
# k: Harris角点检测方程中的自由参数,取值参数为[0.04,0.06]。
# dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的概率越高img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray,4,3,0.04)
# 标记检测到的角点
img[dst>0.01*dst.max()]=[0,0,255]
# 这里通过对角点响应进行闽值处理,标记出检测到的角点。
# 0.05 * dst.max()是一个值,大于这个值的像素点会被标记为红色。
cv2.imshow('img',img)
cv2.waitKey(0)

结果:
在这里插入图片描述
可以看出图片中部分角点已经被标记出来,可用通过更改阈值大小进行角点标记的范围更改。

特征提取sift

SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)是一种非常经典且强大的计算机视觉算法,用于图像的特征提取和描述,以下是对它的详细介绍:

SIFT 算法的特点
  • 尺度不变性:能够在不同尺度下检测到相同的特征点,无论物体在图像中是大是小,SIFT 算法都能准确地找到对应的特征。
  • 旋转不变性:通过计算特征点的主方向,使描述子具有旋转不变性,即使物体在图像中发生了旋转,也能正确匹配特征。
  • 光照不变性:SIFT 特征对光照变化具有一定的鲁棒性,在不同的光照条件下,仍然可以提取到稳定的特征。
  • 独特性:SIFT 特征描述子具有较高的独特性,能够很好地区分不同的物体和场景,降低误匹配的概率。
SIFT 算法的主要步骤
  • 尺度空间极值检测:使用不同尺度的高斯滤波器对图像进行卷积,生成高斯金字塔。然后通过相邻尺度间的差分(DoG,Difference of Gaussians)运算,得到 DoG 金字塔。在 DoG 金字塔中,检测每个点在其邻域内(包括同层和上下层)的极值点,这些极值点就是可能的特征点。
  • 关键点定位:对检测到的极值点进行精确定位,通过拟合三维二次函数来确定关键点的精确位置和尺度。同时,去除低对比度的关键点和位于边缘上的关键点,以提高特征点的稳定性和可靠性。
  • 方向分配:计算每个关键点邻域内的梯度方向直方图,根据直方图的峰值确定关键点的主方向。为每个关键点分配一个或多个方向,使特征描述子具有旋转不变性。
  • 关键点描述:以关键点为中心,取一个大小固定的邻域窗口,并将其旋转到关键点的主方向。将该窗口划分为若干个子区域,计算每个子区域内的梯度方向直方图。将所有子区域的直方图连接起来,形成一个 128 维的特征向量,即 SIFT 特征描述子。
SIFT 算法的应用场景
  • 目标识别:通过提取目标物体的 SIFT 特征,并与数据库中已知物体的特征进行匹配,可以实现对目标物体的识别。例如,在安防监控中,识别特定的人员或物体。
  • 图像拼接:在全景图像拼接中,利用 SIFT 特征匹配不同图像之间的重叠区域,从而实现图像的准确拼接。
  • 三维重建:从多幅图像中提取 SIFT 特征,通过特征匹配计算图像之间的相对位置和姿态,进而构建物体或场景的三维模型。
  • 图像检索:根据图像的 SIFT 特征,在图像数据库中快速检索到与查询图像相似的图像,用于图像管理和检索系统。
SIFT 算法的局限性
  • 计算复杂度高:SIFT 算法的计算量较大,尤其是在处理高分辨率图像时,运算时间较长,对硬件要求较高。
  • 专利问题:SIFT 算法受专利保护,在商业应用中需要获得相应的授权,这在一定程度上限制了它的广泛应用。

sift算法实例

对一张男人的图片进行特征提取:
在这里插入图片描述

'''-----------特征提取sift---------------------'''
# # 检测图像中的关键点
# # cv2.SIFT_create()
# #cv2.xfeatures2d.SIFT_create()#创建一个sift特征的提取对象#
# sift.detect(img)在图像中查找关键点phone = cv2.imread('man.png')
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create() # sift对象
kp = sift.detect(phone_gray)
# kp.pt:关键点的(x,y)
# 坐标。
# kp.size:关键点的大小(尺度):
# kp.angle:关键点的方向。
# kp.response:关键点的响应值。
# kp.octave:关键点所在的金字塔层级。
#查找关键点
# drawKeypoints(image,keypoints,outImage, color=None, flags=None)# image:原始图片
# keypoints:从原图中获得的关键点,这也是画图时所用到的数据
# outputimage:输出图像,可以是原始图片,也可以是None
# color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。绘制富有信息的关键点。# flags:绘图功能的标识设置
phone_sift = cv2.drawKeypoints(phone,kp, None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('phone_sift',phone_sift)
cv2.waitKey(0)
# # 使用sift.compute()计算关键点描述符,方便后期的特征匹配
kp,des = sift.compute(phone,kp)
print(np.array(kp).shape,des.shape)
# 输出关键点的形状和描述符的形状。
# np.array(kp).shape 表示关键点的数量和属性。
# des.shape 表示描述符的数量和属性。

结果:
在这里插入图片描述
在这里插入图片描述

相关文章:

《计算机视觉》——角点检测和特征提取sift

角点检测 角点的定义: 从直观上理解,角点是图像中两条或多条边缘的交点,在图像中表现为局部区域内的灰度变化较为剧烈的点。在数学和计算机视觉中,角点可以被定义为在两个或多个方向上具有显著变化的点。比如在一幅建筑物的图像…...

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言:在人工智能技术飞速发展的今天,深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型,凭借其高效的性能和灵活的部署方式,受到了广泛关注。无论是自然语言处理、图像识别,还是…...

Swift CChar元祖转String

iOS有些API是调用C函数,Swift端获得的数据是CChar元祖,需要转成String方便使用,下面的代码以获取手机型号为例 方式一 var systemInfo utsname() uname(&systemInfo) let deviceModel withUnsafePointer(to: systemInfo.machine) { …...

【刷题】leetcode

题目 现有 s e r v e r N u m 台服务器,编号依次为 1 − s e r v e r...

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…...

Zookeeper(54)如何使用Zookeeper的命令行工具?

使用 Zookeeper 的命令行工具可以方便地进行各种操作,如管理节点、查看状态、设置配置信息等。以下是详细的步骤和代码示例,涵盖如何使用 Zookeeper 的命令行工具。 1. 安装和配置 Zookeeper 首先确保已经安装并配置好 Zookeeper。可以在 Zookeeper 的…...

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中,客户端发出的请求触发相应的视图函数,获取返回值会作为响应的主体,最后生成…...

【数据挖掘】

数据挖掘 目录:1. 数据转换2. 属性选择3. 独立于方案的选择4. 探索空间5. 具体方案的选择6. 离散化数值属性无监督离散化基于熵的离散化其他离散化方法 k-means算法原理算法步骤优缺点优点缺点 代码示例(使用Python和scikit-learn库)代码解释…...

位操作符 练习

一、异或(^) 参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。 即: 0^0 0,1^0 1, 0^1 1,1^1 0 按位异或的3个特点: (1) 0异…...

解决Python升级导致PySpark任务异常方案

背景 上一篇文章中写了 Linux 多Python版本统一和 PySpark 依赖 python 包方案,但是最近升级 Linux 服务器 上 Python 版本(3.6.8 -> 3.7.16,手动编译Python官方的二进制源码)之后,发现之前文章提到 python3 -m v…...

Linux中线程创建,线程退出,线程接合

线程的简单了解 之前我们了解过 task_struct 是用于描述进程的核心数据结构。它包含了一个进程的所有重要信息,并且在进程的生命周期内保持更新。我们想要获取进程相关信息往往从这里得到。 在Linux中,线程的实现方式与进程类似,每个线程都…...

机器视觉检测中,2D面阵相机和线扫相机的区别

2D面阵相机和线扫相机是工业视觉系统中常用的两种相机类型,各有其特点和应用场景。 2D面阵相机 特点: 成像方式:通过二维传感器一次性捕捉整个场景的图像。 分辨率:分辨率由传感器的像素数决定,常见的有百万像素到几千…...

LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))

LeetCode 热题 100_N 皇后(62_51) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(递…...

Winform(C#) 项目保存页面

上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…...

【LeetCode: LCR 126. 斐波那契数 + 动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

OSPF(开放路径最短优先)

ospf优先级&#xff1a;内部优先级默认为10&#xff0c;外部优先级默认为150 1.ospf的三张表 &#xff08;1&#xff09;邻居表 <记录邻居状态和关系> &#xff08;2&#xff09;拓扑表 <链路状态数据库> &#xff08;3&#xff09;路由表 <对链路状态数据库进…...

JAVA EE初阶 - 预备知识(四)

一、API API 即应用程序编程接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一组定义、协议和工具&#xff0c;用于不同软件组件、应用程序或系统之间进行交互和通信。以下从多个方面详细介绍 API&#xff1a; 基本概念 接口规范&#xff1a;A…...

如何解决服务器端口被攻击:全面防护与快速响应

服务器端口被攻击是网络安全中常见的问题之一&#xff0c;尤其是当服务器暴露在公共网络上时&#xff0c;容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务&#xff08;DoS/DDoS&#xff09;攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...

golang panic原理

数据结构与底层实现 Goroutine结构体 stack&#xff08;栈内存范围&#xff09; 结构体类型&#xff0c;包含 lo&#xff08;低地址&#xff09;和 hi&#xff08;高地址&#xff09;两个 uintptr 字段&#xff0c;描述 Goroutine 的栈内存区间 [lo, hi)。初始栈大小为 2KB&a…...

scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...