《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测

文章目录

  • 一、Harris 角点检测
    • 1.基本思想
    • 2.检测步骤
    • 3.OpenCV实现
  • 二、SIFT特征检测
    • 1. SIFT特征检测的基本原理
    • 2. SIFT特征检测的特点
    • 3. OpenCV 实现

一、Harris 角点检测

OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响应函数来确定是否为角点。Harris角点检测算法的基本思想和步骤如下:

1.基本思想

Harris角点检测算法基于图像中角点的局部特征,角点处图像灰度变化明显,且向任何方向移动变化都很大。通过计算每个像素点的响应函数,并设置阈值来确定角点。

2.检测步骤

  1. 灰度化:将彩色图像转换为灰度图像,以便进行后续处理。

  2. 计算图像梯度:使用Sobel等算子计算图像在x和y方向上的梯度。这些梯度反映了图像在水平和垂直方向上的亮度变化。

  3. 计算梯度积方向矩阵(自相关矩阵):对于每个像素点,根据其周围的梯度值计算自相关矩阵。这个矩阵包含了该点x方向梯度的平方和、y方向梯度的平方和以及x方向梯度与y方向梯度的乘积。

  4. 计算角点响应函数:根据自相关矩阵计算Harris响应函数,其定义为 R = det ( M ) − k ⋅ trace ( M ) 2 R = \text{det}(M) - k \cdot \text{trace}(M)^2 R=det(M)ktrace(M)2,其中 M M M为自相关矩阵, det ( M ) \text{det}(M) det(M)为其行列式, trace ( M ) \text{trace}(M) trace(M)为其迹, k k k为一个经验参数,通常在0.04到0.06之间。

  5. 非极大值抑制:对于计算得到的响应函数图像,进行非极大值抑制,即保留局部最大值点,将其余点设为0,以消除重复检测的角点。

  6. 阈值化:根据设定的阈值,将响应函数图像中低于阈值的点排除,以得到最终的角点位置。

3.OpenCV实现

在OpenCV中,可以使用cv2.cornerHarris()函数来实现Harris角点检测。该函数的基本语法如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
  • src:输入图像,应为单通道灰度图像,数据类型为float32。

  • blockSize:角点检测中使用的邻域大小,一般为2、3、4等奇数。

  • ksize:Sobel算子的大小,用于计算x和y方向的梯度,一般为3。

  • k:Harris角点检测方程中的自由参数,一般取值为0.04到0.06。

  • dst:输出图像,与输入图像大小相同,数据类型为float32,其中每个像素点的值表示该点的Harris响应函数值。

  • borderType:像素的边界模式,默认值为cv2.BORDER_DEFAULT

  • 下图为示例图片
    在这里插入图片描述

  • Harris角点检测代码实现

    import cv2# 读取图像并转换为灰度图像
    image = cv2.imread('Ta.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算Harris角点响应图像
    dst = cv2.cornerHarris(gray, blockSize=4, ksize=3, k=0.04)# 标记检测到的角点
    image[dst > 0.05 * dst.max()] = [0, 255, 0]
    # 这里通过对角点响应进行阈值处理,标记出检测到的角点
    # 0.05 * dst.max()是一个值,大于这个值的像素点会被标记为绿色。# 显示结果图像
    cv2.imshow('Harris Corners', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 结果如下:
    在这里插入图片描述

二、SIFT特征检测

**SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)**是一种在图像处理和计算机视觉领域广泛使用的特征检测算法。它主要用于检测图像中的局部特征点,并生成对应的描述符,这些特征点对图像的旋转、尺度缩放和亮度变化具有一定的不变性,同时对视角变化、仿射变换和噪声也保持一定程度的稳定性。以下是SIFT特征检测的详细介绍:

1. SIFT特征检测的基本原理

SIFT算法通过以下几个步骤来实现特征点的检测和描述:

  1. 尺度空间极值检测

    • 搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
    • 构建高斯金字塔DoG(Difference of Gaussian)金字塔,通过比较相邻尺度图像的差分来检测极值点
  2. 关键点定位

    • 在每个候选的位置上,通过拟合精细的模型(如泰勒展开)来确定关键点的精确位置和尺度。
    • 关键点的选择依据于它们的稳定程度,通常选择局部极值点作为关键点。
  3. 方向确定

    • 基于图像局部的梯度方向,为每个关键点分配一个或多个主方向。
    • 通过计算关键点周围区域的梯度幅值和方向来确定主方向,以实现旋转不变性。
  4. 关键点描述

    • 在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。
    • 将这些梯度变换成一种表示,形成关键点的描述符。描述符由关键点周围的梯度方向直方图组成,通过拼接子区域的直方图来形成最终的描述符。
    • 对描述符进行归一化处理,以增强其鲁棒性。
  • 可结合以下图片理解
    在这里插入图片描述

2. SIFT特征检测的特点

  1. 独特性:SIFT特征具有很好的独特性,即使在复杂的场景中也能有效地区分不同的特征点。
  2. 多量性:即使图像中只包含少数几个物体,也能产生大量的SIFT特征向量,为匹配提供更多的可能性。
  3. 高速性:经过优化的SIFT匹配算法可以达到实时的要求,适用于需要快速处理的应用场景。
  4. 可扩展性:SIFT特征可以很方便地与其他形式的特征向量进行联合,提高匹配的准确性和鲁棒性。

3. OpenCV 实现

  • 步骤:
    • 1.加载图像
    • 2.创建SIFT对象
    • 3.检测关键点和计算描述符
    • 4.绘制关键点
    • 5.显示图像
  • 下图为特征检测的图片
    在这里插入图片描述
  • SIFT特征检测代码实现
    import cv2# 加载图像并转换为灰度图
    image = cv2.imread('sea.jpg')
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 在OpenCV中,使用cv2.SIFT_create()或cv2.xfeatures2d.SIFT_create()函数(取决于OpenCV的版本和配置)来创建一个SIFT对象。
    # 这个对象将用于后续的关键点检测和描述符生成。
    sift = cv2.SIFT_create()
    # 或者在某些OpenCV版本中可能需要
    # sift = cv2.xfeatures2d.SIFT_create()# 使用SIFT对象的detectAndCompute()方法来检测图像中的关键点并计算它们的描述符
    keypoints, descriptors = sift.detectAndCompute(image_gray, None)# 使用cv2.drawKeypoints()函数将检测到的关键点绘制到图像上
    image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示图像
    cv2.imshow('Image with Keypoints', image_with_keypoints)
    cv2.waitKey(0)  # 等待任意键盘按键
    cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
    
  • 结果如下:
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十二集:制作完整地图和地图细节设置以及制作相机系统的跟随玩家和视角锁定功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作完整的地图和地图细节设置 1.制作地图前的设置2.制作地图前期该做的事3.制作地图之堆叠素材4.制作地图后期该做的事5.制作地图之修复意想不到的Bug二、…

C++仿函数的介绍以及priority_queue的介绍和模拟实现

目录 1.仿函数 1.1仿函数的介绍 1.2自定义类型使用仿函数 1.3自定义支持比较大小,但是比较的逻辑不是自己想要的逻辑 2.优先级队列priority_queue 2.1priority_queue的介绍 2.2priority_queue的使用 2.3priority_queue的模拟实现 1.仿函数 1.1仿函数的介绍…

【C语言】指针篇 | 万字笔记

写在前面 在学习C语言过程,总有一个要点难点离不开,那就是大名鼎鼎的C语言指针,也是应为有指针的存在,使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助🥰🥰 学习指…

彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)

该系统也没版本号,此版本目前是比较新的版本,增加了订单投诉功能,和一个好看的二次元模板。 此版本是全开源版,无一处加密文件,系统默认是安装后是打不开的, 本站特别修复了BUG文件,在PHP7.4环境下也没问…

Java的学习(语法相关)

字符串存储的问题 char 和字符串都是字符的集合,它们之间的确有相似性,但在 Java 中它们有着不同的存储机制和处理方式。让我从 char 和 String 的本质区别入手来解释。 1. char 和 String 的区别 char 是基本类型:char 是 Java 中的基本数据…

【C++】多态(下)

个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

CORE MVC 过滤器 (筛选器)

MVC FrameWork MVCFramework MVC Core 过滤器 分 同步、异步 1、 授权筛选器 IAuthorizationFilter,IAsyncAuthorizationFilter 管道中运行的第一类筛选器,用来确定发出请求的用户是否有权限发出当前请求 2、资源筛选器 IResourceFilter ,…

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序,并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…

Vue3项目开发——新闻发布管理系统(九)(完结篇)

文章目录 十一、用户信息管理1、用户基本资料管理1.1 页面设计1.2 封装接口,更新信息2、更换头像2.1 静态结构2.2 选择图片预览2.3 上传头像3、重置密码3.1 页面设计3.2 封装接口,更新密码十二、项目打包十三、系统全部源码下载十一、用户信息管理 用户信息管理包括功能:基…

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)征稿

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)由湖南第一师范学院主办,南京师范大学、山东女子学院、爱迩思出版社(ELSP)协办。 大会将专注于机器人、数字化、自动化、人工智能等技术的开发和融合&#xff0c…

如何让 Android 的前端页面像 iOS 一样“优雅”?

作者:方英杰(崇之) 最近在调研前端页面适配 Android 端异形屏的方案,调研过程中发现了一些比较有意思的点,本文主要是做一个总结。 一、提出问题 首先,我们需要知道 Android 上的前端适配面临着什么问题。 问题其实很…

【含文档】基于Springboot+Vue的停车场车位预约系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

ICPC-day1(NTT)

NTT经典例题 CCPC-Winter-Camp-day6-A——NTT经典例题 对于上面格式,如果想求出每个i的值可以使用卷积求出,因为阶乘j和阶乘i-j相乘的值为(i(i-j))i 补充一个二次剩余定理 P5491 【模板】二次剩余 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //#in…

基于工业物联网的能源监控系统:边缘数据处理的应用

论文标题:《Industrial IoT-Based Energy Monitoring System: Using Data Processing at Edge》 作者信息: Akseer Ali MiraniAnshul AwasthiNiall O’MahonyJoseph Walsh 他们均来自爱尔兰的芒斯特技术大学IMaR研究中心,以及位于利默里克的…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM(Java Virtual Machine) 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器(PC寄存…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景: 2.字符串函数 字符串函数使用场景: 3.数学函数 4.控制流函数 1.日期函数 函数示例: 1.在日期的基础上加日期 在该日期下,加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?

目录 一、Context是什么? 在Android中,Context是一个抽象类 ,它代表了应用程序的当前状态,包括资源和类加载器等,它提供了一个应用运行所需的信息,比如我们要获取资源 ,那么需要她,…

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下,雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题,雷池获取到的…

【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?

💐个人主页:初晴~ 📚相关专栏:寻找one piece的刷题之路 什么是双指针算法 双指针算法是一种常用的编程技巧,尤其在处理数组和字符串问题时非常有效。这种方法的核心思想是使用两个指针来遍历数据结构,这两…

【HTML+CSS】仿电子美学打造响应式留言板

创建一个响应式的留言板 在这篇文章中,我们将学习如何创建一个简单而美观的留言板,它将包括基本的样式和动画效果,以及响应式设计,确保在不同设备上都能良好显示。 HTML 结构 首先,我们创建基本的HTML结构。留言板由…