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

《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析

目录

一、角点检测

1、什么是角点检测

2、检测流程

        1)输入图像

        2)图像预处理

        3)特征提取

        4)角点检测

        5)角点定位和标记

        6)角点筛选或后处理(可选)

        7)输出结果

3、邻域

4、案例实现

        运行结果:

二、特征提取sift

1、什么是特征提取

2、步骤

        1)数据预处理

        2)特征选择

        3)特征提取

        4)特征表示

3、案例实现

        运行结果:


一、角点检测

1、什么是角点检测

        角点检测是计算机视觉中的一种特征检测方法,用于寻找图像中的角点或者具有角点特征图像区域。角点是指图像中突然改变方向的点,即在其周围的不同方向上都有较大的灰度变化。角点具有一些特殊性质,如旋转不变性、尺度不变性和光照不变性等,因此在图像处理和计算机视觉中具有广泛的应用。

2、检测流程

        1)输入图像

                将待检测的图像作为输入。

        2)图像预处理

                对输入图像进行必要的预处理,如灰度化、降噪等,以便更好地进行角点检测。

        3)特征提取

                使用角点检测算法对预处理后的图像进行角点特征提取。常见的角点检测算法有Harris角点检测算法、Shi-Tomasi角点检测算法等。

        4)角点检测

                根据所选的角点检测算法,计算图像中的每个像素点的角点响应值,以判断其是否为角点。具体算法会根据不同的方法而有所差异。

        5)角点定位和标记

                根据角点响应值,确定角点的位置,并进行标记。可以使用函数或算法来绘制或返回角点的位置信息。

        6)角点筛选或后处理(可选)

                根据具体需求,可以对检测到的角点进行筛选或进行后处理操作,如非极大值抑制阈值过滤等,以去除不准确的角点或增强有效的角点。

        7)输出结果

                根据需要,可以将检测到的角点的位置信息、图像中绘制的标记或其他相关信息作为输出结果。

3、邻域

        在角点检测中,邻域指的是一个中心像素周围的一组像素点。在检测角点时,我们需要考虑中心像素周围的像素点的特征,如灰度变化,梯度等。这些特征的计算通常需要使用邻域内的像素信息。

        邻域的大小在角点检测中非常重要,它决定了我们考虑的像素点的数量。通常,邻域的大小取决于具体的角点检测算法和应用场景。较大的邻域可以捕获更多的细节信息,但会增加计算的复杂性;较小的邻域可以加快计算速度,但可能会导致角点检测结果不准确。

4、案例实现

# 角点指图像中局部区城与周围区域有较大灰度变化的点或像素。
# cornerHarris(img,blockSize, ksize, kl, dst[, borderType]])-> dst
# img:输入图像。
# blocksize:角点检测中要考虑的领域大小。
# ksize:Sobel求导中使用的窗口大小。
# k:Harris角点检测方程中的自由参数,取值参数为[0.04,0.06]。
# dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的機率越高img = cv2.imread('huanghelou.png')   # 导入图像
cv2.imshow('img1',img)
cv2.waitKey(0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 转变为灰度图
dst = cv2.cornerHarris(gray,4,3, 0.04)  # 输入图像gray必须是灰度图,4表示领域的大小为2*2,
# 3为计算梯度图的Sobel算子的孔径大小,0.04表示角点检查灵敏度,越小检测到的角点越多
# dst为与输入图像相同大小的矩阵
# Sobel算子是一种常用的边缘检测算子# 标记检测到的角点
img[dst > 0.05 * dst.max()] = [0,255,0]  # 将原图像中灰度值大于0.05*dst.max()的值标记为绿色
# 这里通过对角点响应进行阈值处理,标记出检测到的角点。
# 0.05 * dst.max() 是一个阈值,大于这个值的像素点会被标记为绿色。
cv2.imshow('img',img)
cv2.waitKey(0)
        运行结果:

二、特征提取sift

1、什么是特征提取

        特征提取是指从原始数据提取出具有辨识性代表性特征,用于描述和表示数据的关键信息。在计算机视觉、模式识别和机器学习等领域,特征提取是一项关键的任务,因为原始数据通常含有大量冗余和噪声,通过提取特征可以减少数据的维度、去除冗余信息,从而更好地捕捉数据的潜在模式和结构。

        特征可以是数据的某种可测量的属性,比如颜色、纹理、形状、梯度等。特征提取的目标是选择和计算这些特征,使其能够表达出不同类别或实例之间的差异和相似性。

        SIFI尺度不变特征转换是一种机器视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变数。

2、步骤

        1)数据预处理

                对原始数据进行预处理,如去噪、归一化、平滑等

        2)特征选择

                从原始数据中选择合适的特征子集,以避免冗余和噪声。

        3)特征提取

                根据领域知识或数学算法,计算和提取数据中的特征。

        4)特征表示

                将提取到的特征表示成一组数值、向量或其他形式,便于计算机处理和分析。

        特征提取的好坏对于后续的数据分析、模型训练和模式识别任务至关重要。一个好的特征应该能够具有辨别性区分不同类别或实例,并且具有鲁棒性,对于数据的变形和噪声有一定的容忍度

3、案例实现

import numpy as npman = cv2.imread('man.png')
cv2.imshow('man',man)
cv2.waitKey(0)
man_gray = cv2.cvtColor(man,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()  # 创建一个sift对象
kp = sift.detect(man_gray)   # 在灰度图中查找关键点
for x in kp:   # 打印所有关键点坐标print(x.pt)# drawKeypoints(image,keypoints,outImage, color=None, flags=None)
# image:原始图片
# keypoints:从原图中获得的关键点,这也是画图时所用到的数据
# outputimage:输出图像,可以是原始图片,也可以是None
# color:颜色设置过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
# flags:绘图功能尚标识设置
# 绘制关键点,在原始图像上,绘制点kp,None表示不使用绘制匹配项的图像,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS指定绘制关键点的样式
man_sift = cv2.drawKeypoints(man,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('man sift',man_sift)   # 展示绘制了关键信息的图片
cv2.waitKey(0)# 使用sift.compute()计算关键点描述符,方便后期的特征匹配
keypoints,des = sift.compute(man,kp)  # man原始图像,kp检测到的关键点坐标的列表,des是一个numpy数组,包含所有关键点的描述符
print(np.array(keypoints).shape,des.shape)  # 打印关键点的个数,以及关键点的描述符矩阵的形状
# 输出关键点的形状和描述符的形状。
# np.array(keypoints).shape 表示关键点的数量和形状。
        运行结果:

相关文章:

《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析

目录 一、角点检测 1、什么是角点检测 2、检测流程 1)输入图像 2)图像预处理 3)特征提取 4)角点检测 5)角点定位和标记 6)角点筛选或后处理(可选) 7)输出结果 3、邻域…...

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…...

基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统

目录 一、项目背景及需求分析 1. 项目背景 2. 需求分析 二、系统架构设计 1. 技术选型 2. 模块划分 三、数据库设计数据库表结构 四、前端实现 五、后端实现 1. RESTful API设计 2. 数据库操作 六、安全性和性能优化 1. 安全性 2. 性能优化 七、测试与部署 1. …...

【数据结构与算法】时间复杂度和空间复杂度例题

文章目录 时间复杂度常数阶时间O(1)对数阶时间O(logN)线性阶时间O(n)线性对数阶时间O(nlogN)平方阶时间O(n*n) 空间复杂度常量空间O(1)线性空间O(n)二维空间O(n*n)递归空间 时间复杂度 常数阶时间O(1) 代码在执行的时候,它消耗的时间并不随着某个变量的增长而增长…...

停止模式下USART为什么可以唤醒MCU?

在MCU的停止模式下,USART之类的外设时钟是关闭的,但是USART章节有描述到在停止模式下可以用USART来对MCU进行唤醒: 大家是否会好奇在外设的时钟被关闭的情况下,USART怎么能通过接收中断或者唤醒事件对MCU进行唤醒的呢&#xff1…...

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码:路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…...

JSR303微服务校验

一.创建idea 二.向pom.xml添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version></parent><properties><java.vers…...

56. QTreeWidget的基本使用

1. 说明 在软件开发中会遇到将数据信息制作成一种树目录的形式进行展示,那么此时就可以借助QT提供的QTreeWidget控件来实现这种需求,本篇博客会做一个案例简要说明这个控件的基本使用方法,博客中代码能够实现的功能是将此项目代码所在文件夹中的内容展示出来,如下图所示:…...

领域偏移:协变量移位下的域自适应

现在我们将焦点转移到一种叫做协变量转移的扰动上。我们在一个分类或回归设置中工作&#xff0c;我们希望从x预测y&#xff0c;并假设p≈(y | x)和p∗(y | x)是相同的(标记函数在训练和测试之间不会改变) 假设 (Covariate Shift)。对于列车分布p~和检验分布p∗&#xff0c;我们…...

前端开发技术框架选型

一、引言 在前端开发领域&#xff0c;技术框架的选择对于项目的成功至关重要。一个优秀的前端框架不仅可以提高开发效率&#xff0c;还能确保项目的稳定性和可扩展性。而不同的框架具有不同的特点和优势&#xff0c;能够满足不同项目的需求。下面将对目前主流的前端开发技术框…...

/etc/init.d/mysql

Since you’ve installed MySQL from source, you’ll need to create a custom init script to manage the MySQL server (start, stop, status) similarly to a service. Here’s a simple init.d script template for MySQL that you can use. This script assumes MySQL is…...

Qt_线程介绍与使用

目录 1、QThread常用API 2、Qt线程安全 3、使用线程QThread 4、connect函数的第五个参数 5、Qt互斥锁 5.1 QMutexLocker 6、条件变量 7、信号量 结语 前言&#xff1a; 线程是应用程序开发非常重要的概念&#xff0c;在Qt中&#xff0c;用QThread类来实现多线程&a…...

通讯方面的数据,人工智能 机器学习的时候,因为数字都接近于一,数据归一化的一种方法,做了一个简化版本的Z-score标准化

这个表达式实现了一种形式的数据归一化&#xff0c;它将张量x中的每个元素除以x的标准差的估计值。这种处理方式可以使得变换后的数据具有单位标准差&#xff08;假设数据已经是零均值或者在计算过程中考虑了均值&#xff09;。具体来说&#xff0c;它是基于以下步骤进行的&…...

python itertools模块介绍

itertools 是 Python 内建的一个高效处理迭代器的模块&#xff0c;提供了创建复杂迭代器的函数工具。它包含一系列用于迭代、组合、排列、过滤等功能的迭代器构建工具&#xff0c;常用于数据处理和算法设计。下面是 itertools 模块中一些常见的函数介绍&#xff1a; 1. 无限迭…...

【分布式微服务云原生】5分钟深入剖析Kafka:Leader与Follower分区的秘密及负载均衡的艺术

深入剖析Kafka&#xff1a;Leader与Follower分区的秘密及负载均衡的艺术 摘要&#xff1a; Apache Kafka作为当前最流行的分布式流处理平台之一&#xff0c;其内部的分区机制和消费者组的负载均衡策略是实现高吞吐量和高可靠性的关键。本文将深入探讨Kafka中Leader分区与Follo…...

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…...

深入了解 MPlayer:Linux 系统中的多功能多媒体播放器

文章目录 深入了解 MPlayer&#xff1a;Linux 系统中的多功能多媒体播放器一、MPlayer 的安装二、MPlayer 的基本使用三、MPlayer 音频功能详解1. 支持的音频格式2. 调整音频输出设备3. 使用音频滤镜和效果4. 音频输出格式转换5. 多声道与环绕声支持6. 音频控制&#xff1a;播放…...

Netty系列-7 Netty编解码器

背景 netty框架中&#xff0c;自定义解码器的起点是ByteBuf类型的消息, 自定义编码器的终点是ByteBuf类型。 1.解码器 业务解码器的起点是ByteBuf类型 netty中可以通过继承MessageToMessageEncoder类自定义解码器类。MessageToMessageEncoder继承自ChannelInboundHandlerAdap…...

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)

在上篇文章中&#xff0c;我们学习了移植rk的npu驱动到OpenHarmony提供的内核。本文我们来学习如何在OpenHarmony标准系统rk系列芯片如何使用npu OpenHarmony RK系列芯片运行npu测试用例 在移植npu驱动到OpenHarmony之后&#xff0c;来运行npu样例进行简单测试 1.O 测试准备…...

大表性能优化的关键技术

1 引言 在现代企业应用中,随着数据量的不断增长,大表的性能优化成为数据库管理的重要环节。本文将探讨大表性能优化的关键技术,包括索引优化、查询优化、分区分表、读写分离以及缓存策略等方面。通过综合运用这些技术,可以显著提升大表的处理效率和响应速度,确保系统的稳…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...