opencv学习:Harris角点检测和SIFT(尺度不变特征变换)算法完整代码实现

news2024/9/30 3:26:42

Harris角点检测

概念

Harris角点检测是一种在图像处理和计算机视觉领域广泛使用的技术,用于检测图像中的角点。角点是图像中两条边缘交点的位置,它们在图像分析、目标识别和图像配准等任务中非常重要。

角点:图像中的角点是指图像局部区域内,两条边缘或边界交会的点。在角点处,图像的梯度方向会发生显著变化。

Harris角点检测器:Harris角点检测器是一种基于梯度的方法,用于识别图像中的角点。它通过计算图像强度函数的局部自相关矩阵来工作。

原理

Harris角点检测的基本原理可以概括为以下几个步骤:

  1. 图像的预处理:通常包括将图像转换为灰度图,因为角点检测不依赖于颜色信息。

  2. 计算梯度:对图像应用Sobel算子或其他梯度算子,计算图像每个像素点的梯度值和梯度方向。

  3. 构造结构张量(结构矩阵):结构张量是一个2x2的矩阵,它量化了图像在每个像素点的梯度变化。对于每个像素点,计算其邻域内的梯度值,并构造结构张量 MM 。

  4. 计算特征值:计算结构张量的两个特征值。角点处的特征值会显著不同,因为角点处的边缘在两个方向上都有显著的梯度变化。

  5. 应用Harris检测公式:Harris检测公式用于评估每个像素点成为角点的可能性。公式如下:

    R=det⁡(M)−k(trace(M))2R=det(M)−k(trace(M))2

    其中,det⁡(M)det(M) 是矩阵 MM 的行列式,trace(M)trace(M) 是矩阵 MM 的迹,kk 是一个经验常数,通常设置在0.04到0.06之间。

  6. 非极大值抑制和阈值化:对 RR 值进行非极大值抑制,以确保每个局部区域内只保留最强的角点候选。然后,应用一个阈值来确定最终的角点。

  7. 标记角点:在原始图像上标记出检测到的角点。

实验步骤

  1. 使用OpenCV读取图像文件'hhl.png'。将图像转换为灰度图,因为角点检测通常在灰度图上进行。
    import cv2
    img=cv2.imread('hhl.png')
    #灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

  2. 使用Harris角点检测算法对灰度图进行角点检测。
    #Harris角点检测
    dst=cv2.cornerHarris(gray,4,3,0.04)
    #使用Harris角点检测算法对灰度图进行角点检测。
    #参数4是邻域大小,3是Sobel算子的孔径大小,0.04是Harris检测器的自由参数。

  3. 在原图像上标记检测到的角点。
    # 标记角点
    img[dst>0.05*dst.max()]=[0,0,255]
    #在原图像上标记检测到的角点。
    #这里使用了一个阈值,即如果角点的响应值大于dst数组最大值的5%,则将该点标记为红色。

  4. 显示处理后的图像。
    cv2.imshow('img',img)
    cv2.waitKey(0)
    

运行结果

完整代码

import cv2
img=cv2.imread('hhl.png')
#灰度图
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#Harris角点检测
dst=cv2.cornerHarris(gray,4,3,0.04)
# 标记角点
img[dst>0.05*dst.max()]=[0,0,255]
cv2.imshow('img',img)
cv2.waitKey(0)

SIFT(尺度不变特征变换)算法

        SIFT(尺度不变特征变换)是一种用于检测和描述局部特征的算法,广泛应用于图像匹配、目标识别、3D重建等领域。SIFT特征对于旋转、尺度缩放、亮度变化具有很好的不变性,因此非常适用于处理现实世界中的图像。

概念

局部特征:局部特征是指图像中那些在小区域内具有独特属性的点,如角点、边缘等。

尺度不变:意味着特征在不同尺度(大小)的图像中都能被检测到。

特征描述符:用于描述关键点周围区域的向量,用于后续的图像匹配。

原理

SIFT算法的实现可以分为以下几个主要步骤:

  1. 尺度空间极值检测

    • SIFT算法首先使用高斯差分金字塔(DoG金字塔)来检测尺度空间中的极值点。高斯差分金字塔是通过在不同尺度上对图像应用高斯模糊并计算差分得到的。
    • 在每个尺度上,算法会比较每个像素与周围像素的亮度差异,以确定该点是否为极值点。
  2. 关键点定位

    • 对于每个极值点,算法会进行亚像素精确定位,以确定关键点的精确位置。
    • 同时,算法还会评估每个关键点的尺度,以确保其尺度不变性。
  3. 方向赋值

    • 为了使特征具有旋转不变性,SIFT算法为每个关键点分配一个或多个方向。这是通过计算关键点周围区域的海森矩阵的主方向来实现的。
  4. 关键点描述

    • 算法在关键点周围的16x16像素区域内构建一个方向梯度直方图,以生成关键点的描述符。
    • 每个方向直方图分为4个方向,总共有8个方向直方图,每个直方图有4个bins,因此每个关键点的描述符长度为128维。
  5. 去除低对比度点和边缘点

    • 在构建描述符时,算法会去除低对比度的点和位于边缘附近的点,以增强特征的稳定性。
  6. 生成特征向量

    • 最后,将所有关键点的描述符组合成一个特征向量,用于后续的图像匹配。

代码步骤

  1. 读取图像

    • 使用OpenCV的imread函数读取名为'man.png'的图像文件。
    • 将读取的图像从BGR颜色空间转换为灰度图,因为SIFT算法通常在灰度图上进行。
      phone=cv2.imread('man.png')
      phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)
  2. 创建SIFT检测器

    • 使用OpenCV的SIFT_create函数创建一个SIFT检测器对象。
      # 创建SIFT检测器
      sift=cv2.SIFT_create()
  3. 检测关键点

    • 使用SIFT检测器在灰度图上检测关键点,并将结果存储在变量kp中。
      # 检测关键点
      kp=sift.detect(phone_gray)
  4. 打印关键点坐标

    • 循环遍历检测到的关键点,并打印每个关键点的坐标。
      for i in kp:
          print(i.pt)
  5. 绘制关键点

    • 使用OpenCV的drawKeypoints函数在原图像上绘制检测到的关键点。
    • 使用OpenCV的imshow函数显示绘制了关键点的图像。
      phone_sift=cv2.drawKeypoints(phone,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
      cv2.imshow('sift',phone_sift)
      cv2.waitKey(0)
  6. 计算描述符

    • 使用SIFT检测器计算图像中关键点的描述符。
      kp,des=sift.compute(phone,kp)
  7. 打印关键点和描述符的形状

    • 打印关键点数组和描述符数组的形状。
      print(np.array(kp).shape,des.shape)

运行结果

完整代码

import cv2
phone=cv2.imread('man.png')
phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)
# 创建SIFT检测器
sift=cv2.SIFT_create()
# 检测关键点
kp=sift.detect(phone_gray)
for i in kp:
    print(i.pt)
# 绘制关键点
phone_sift=cv2.drawKeypoints(phone,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('sift',phone_sift)
cv2.waitKey(0)
# 计算描述符
kp,des=sift.compute(phone,kp)
print(np.array(kp).shape,des.shape)

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

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

相关文章

GDB :代码调试工具

文章目录 一、启动GDB二、GDB的基本命令1. 显示代码2. 运行程序3. 设置断点4. 单步执行5. 查看变量和内存6. 查看函数调用堆栈7. 修改变量值8. 退出GDB 一、启动GDB 在终端中,使用以下命令启动GDB并加载你的可执行文件: gdb ./your_program会进入以下界…

应用性能管理工具-SkyWalking

前言 随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂,因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决…

关于大模型的10个思考

9月28日,第四届“青年科学家50论坛”在南方科技大学举行,美国国家工程院外籍院士沈向洋做了《通用人工智能时代,我们应该怎样思考大模型》的主题演讲,并给出了他对大模型的10个思考。 以下是他10个思考的具体内容: 1…

STM32移植RT-Thread实现DAC功能

在进行DAC的学习中,发现RT-Thread中没有该外设的驱动,因此需要自己进行相关配置 1.配置RT-Thread Setting中的DAC组件 2.在HAL库中完成DAC的配置(HAL库起到时钟的作用) 不懂HAL库配置的最好学一下HAL库的编程思想 3.在board.h中添加宏定义 我的RT-T…

关于分箱的一些介绍

在这篇文章中,我将介绍一种数据预处理的技术——分箱,然会将会从概念、步骤、分类、应用场景、注意事项与实际操作等方面去介绍它。 一、概念 分箱(Binning)是一种数据预处理技术,在数据分析和机器学习中经常使用。它…

Java8 用流收集数据之归约汇总

目录 规约汇总最大值 (max)・最小值 (min)统计总数 (count)统计求和 (summingInt・summingLong・summingDouble・sum)平均值 (averagingInt・averagingLong・averagingInt・average)统计梗概 (summarizingInt・summarizingLong・summarizingDouble・summ…

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机,旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法,能够自动识别和分析家中宠物的行为,并提供定制化的护理建议。 SiiPet相机的核心功…

益而益集团荣获2024年江苏省智能制造车间称号

近日,江苏省工信厅公示2024年江苏省智能制造车间名单,苏州益而益电器制造有限公司以其卓越的智能化转型成果,荣获2024年度江苏省级智能制造车间称号。 此次获评,是江苏省政府对益而益集团智能化高质量转型发展的认可及肯定&#…

活动在线报名小程序源码系统 自主提交表单+创建表单 带完整的安装代码包以及搭建部署教程

系统概述 随着各类活动的日益丰富和多样化,传统的报名方式逐渐显现出其局限性。纸质报名表格繁琐易错、人工统计费时费力,难以满足现代活动管理的需求。因此,开发一款集自主提交表单和创建表单功能于一体的活动在线报名小程序源码系统成为必…

mit6824-01-MapReduce详解

文章目录 MapReduce简述编程模型执行流程执行流程排序保证Combiner函数Master数据结构 容错性Worker故障Master故障 性能提升定制分区函数局部性执行缓慢的worker(slow workers) 常见问题总结回顾参考链接 MapReduce简述 MapReduce是一个在多台机器上并行计算大规模数据的软件架…

C++进阶知识2 多态

多态 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.1.2 虚函数2.1.3 虚函数的重写/覆盖2.1.5 虚函数重写的⼀些其他问题2.1.6 override和final关键字2.1.7 重载/重写/隐藏的对⽐ 3. 多态的原理3.2 多态的原理3.2.1 多态是如何实现的3.2.2 动态绑定与静态绑定3.2.3 虚函…

828华为云征文|部署在线文档应用程序 CodeX Docs

828华为云征文|部署在线文档应用程序 CodeX Docs 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 CodeX Docs3.1 CodeX Docs 介绍3.2 CodeX Docs 部署3.3 CodeX…

SpringBoot整合JPA 基础使用

一、什么是JPA ‌‌1.JPA的定义和基本概念‌‌ ‌JPA(Java Persistence API)‌是Java中用于进行持久化操作的一种规范,它定义了一系列用于操作关系型数据库的API接口。通过这些接口,开发人员可以方便地进行数据库的增删改查等操…

ArcgisEngine开发中,Ifeatureclass.Addfield 报错0x80040655处理方法

1、ArcgisEngine开发中,Ifeatureclass.Addfield 报错0x80040655。如下图所示。 2、经分析,这是由于字段类型错误,经检查,是由于字段名为中文名,超出shp格式的最大字段长度量,看资料说是5个中文字符&#xf…

fastadmin 搜索提交重置按钮文本修改

默认 修改require-backend.min.js文件 效果 当然最好还是去需修改lang文件 效果 如果修改没生效记得清楚一下缓存,再刷新 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你…

校园跑腿系统二手市场校园搭子校园社团活动系统2000的和4800的有什么区别

校园跑腿系统、二手市场、校园搭子、校园社团活动系统在不同价格档位(如2000元和4800元)之间可能存在多方面的区别,这些区别主要体现在功能丰富性、技术支持、用户体验、定制化程度以及后续服务等方面。然而,由于具体的价格差异和…

TDengine 流计算与窗口机制的深度解析:揭示计数窗口的关键作用

在 TDengine 3.2.3.0 版本中,我们针对流式计算新增了计数窗口,进一步优化了流式数据处理的能力。本文将为大家解读流式计算与几大窗口的关系,并针对新增的计数窗口进行详细的介绍,帮助大家进一步了解 TDengine 流式计算&#xff0…

趣味SQL | 从围棋收官到秦楚大战的数据库SQL实现(下)

目录 0 上集回顾 1 双先量化,得失权衡 2 各守城池,妥协攻守 3 SQL演算,三策评详 4 寸土必争,利益倍增 5 SQL再演,策略精进 6 棋道相通,治国有术 如果觉得本文对你有帮助,那么不妨也可…

这是我见过最强的AI大模型教程书籍!免费白嫖,可以上车!!

这是LLM入门级书籍,共145页,主要介绍了大型语言模型(LLM)的基本原理和底层技术。 阅读本书,您将能够掌握 LLM 的基本概念,了解自然语言处理(NLP)的发展历程,理解 Transf…

家中浮毛太多怎么办?希喂、米家、安德迈更推荐哪款?

在现代养宠家庭生活中,宠物空气净化器已经成为不可或缺的家电之一。 而在众多空气净化器类型中,宠物空气净化器以其独特的设计和卓越的净化效果,逐渐赢得了越来越多养宠家庭的青睐。 它不仅能有效地吸附空中飞舞的浮毛,还能高效…