当前位置: 首页 > 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)删…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...