《计算机视觉》——角点检测和特征提取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 表示描述符的数量和属性。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/971730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例

随着机器人技术和人工智能的迅速发展,具身智能在各行业的应用日益广泛,尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作,存在着高温、高压、强电磁场等危险环境,且效率较低。开关柜带电操作机器人作…

基于SpringBoot实现的大学社团平台系统实现功能八

一、前言介绍: 1.1 项目摘要 随着高校社团活动的日益丰富和多样化,学生对于社团管理和参与的需求也在不断增加。传统的社团管理方式往往存在效率低下、信息不透明等问题,无法满足现代学生对于便捷、高效社团管理的需求。因此,利…

Unity使用反射进行Protobuf(CS/SC)协议,json格式

protobuf生成的协议,有挺多协议的.利用反射生成dto进行伪协议的响应 和 发送请求 应用场景: 请求(CS)_后端先写完了(有proto接口了),前端还没搞完时(暂还没接入proto),后端可使用此请求,可自测 响应(SC)_可自行构建一个响应(有些特殊数据后端下发不了的),对数据进行测试 // 请…

使用synchronized解决高并发场景

synchronized能很好的解决高并发所带来的超卖等问题,但是synchronized也有属于它的缺陷,就是只适合单机模式,如果同时开启多个实例,那么还是会出现超卖的情况,下面就介绍一下synchronized使用方法,十分的简…

【Pytorch 库】自定义数据集相关的类

torch.utils.data.Dataset 类torch.utils.data.DataLoader 类自定义数据集示例1. 自定义 Dataset 类2. 在其他 .py 文件中引用和使用该自定义 Dataset torch_geometric.data.Dataset 类torch_geometric.data.Dataset VS torch.utils.data.Dataset 详细信息,参阅 tor…

Softing线上研讨会 | 自研还是购买——用于自动化产品的工业以太网

| 线上研讨会时间:2025年1月27日 16:00~16:30 / 23:00~23:30 基于以太网的通信在工业自动化网络中的重要性日益增加。设备制造商正面临着一大挑战——如何快速、有效且经济地将工业以太网协议集成到其产品中。其中的关键问题包括:是否只需集成单一的工…

Wireshark 输出 数据包列表本身的值

在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…

解压rar格式的软件有哪些?8种方法(Win/Mac/手机/网页端)

RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而&#xf…

java实现不带哨兵节点的双向链表(二)

概述 todo 扩展:实现链表节点的删除(根据索引删除节点、删除第一个元素)、添加的元素为数组最后一个元素(addLast)等 实现上一篇博客中提到的 根据索引删除节点。删除第一个元素。添加的元素为数组最后一个元素。 根…

AcWing 798. 差分矩阵

题目来源: 找不到页面 - AcWing 题目内容: 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将…

【kafka系列】消费者

目录 获取消息 1. 消费者获取消息的流程逻辑分析 阶段一:消费者初始化 阶段二:分区分配与重平衡(Rebalance) 阶段三:消息拉取与处理 阶段四:偏移量提交 核心设计思想 2. 流程 关键点总结 常见参数…

游戏引擎学习第105天

仓库:https://gitee.com/mrxiao_com/2d_game_2 查看当前进度 今天的工作重点是继续进行渲染系统的清理。昨天已经完成了一次渲染清理,现在还有一些内容需要继续处理。首先,已经解决了坐标系统的问题,其中世界坐标基本上是正确的&#xff0c…

重新求职刷题力扣DAY15

1.[226. 翻转二叉树](https://leetcode.cn/problems/symmetric-tree/) 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2&#xff1a…

OpenGL ES -> 投影变换矩阵完美解决绘制GLSurfaceView绘制图形拉伸问题

GLSurfaceView绘制图形拉伸问题 假如在XML文件中声明GLSurfaceView的宽高为 android:layout_width"match_parent"android:layout_height"match_parent GLSurfaceView绘制的图形在Open GL ES坐标系中,而Open GL ES坐标系会根据GLSurfaceView的宽高将…

Java并发编程8--线程

1.什么是线程? 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的…

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…

开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程

----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞👍 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…

【设计模式】【行为型模式】访问者模式(Visitor)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

将pyspark中的UDF提升6倍

本文亮点 调用jar中的UDF,减少python与JVM的交互,简单banchmark下对于54亿条数据集进行udf计算,从3小时的执行时间缩短至16分钟。 牺牲UDF部分的开发时间,尽量提高性能。 以接近纯python的开发成本,获得逼近纯scala的性…

告别第三方云存储!用File Browser在Windows上自建云盘随时随地访问

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 无论是个人用户还是企业团队,都希望能够有一个高效、安全的解决方案来…