《计算机视觉》——角点检测和特征提取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优先级:内部优先级默认为10,外部优先级默认为150 1.ospf的三张表 (1)邻居表 <记录邻居状态和关系> (2)拓扑表 <链路状态数据库> (3)路由表 <对链路状态数据库进…...
JAVA EE初阶 - 预备知识(四)
一、API API 即应用程序编程接口(Application Programming Interface),是一组定义、协议和工具,用于不同软件组件、应用程序或系统之间进行交互和通信。以下从多个方面详细介绍 API: 基本概念 接口规范:A…...
如何解决服务器端口被攻击:全面防护与快速响应
服务器端口被攻击是网络安全中常见的问题之一,尤其是当服务器暴露在公共网络上时,容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务(DoS/DDoS)攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...
golang panic原理
数据结构与底层实现 Goroutine结构体 stack(栈内存范围) 结构体类型,包含 lo(低地址)和 hi(高地址)两个 uintptr 字段,描述 Goroutine 的栈内存区间 [lo, hi)。初始栈大小为 2KB&a…...
scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析
scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...


