python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

目录

    • harris角点检测
      • 原理
      • 函数
    • 图像尺度空间
      • 概念
      • 局部不变性
      • 局部不变特征
      • SIFT算法

harris角点检测

原理

Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。

该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Harris 角点检测通过以下步骤实现:

  1. 计算图像的梯度: 对图像进行空间梯度的计算,通常使用 Sobel 等滤波器。

  2. 计算结构矩阵: 对每个像素点,根据其周围像素的梯度计算一个结构矩阵。结构矩阵是一个2x2的矩阵,其中包含了该像素点附近局部梯度的信息。

  3. 计算角点响应函数: 利用结构矩阵的信息,计算每个像素点的角点响应函数。Harris 角点检测使用如下的角点响应函数:

R = det ⁡ ( M ) − k ⋅ trace 2 ( M ) R = \det(M) - k \cdot \text{trace}^2(M) R=det(M)ktrace2(M)

其中,M是结构矩阵, det ⁡ \det det表示矩阵的行列式, trace \text{trace} trace 表示矩阵的迹,k是一个常数(通常取较小的值)。

  1. 选取角点: 通过对角点响应函数进行阈值处理,选择角点。通常,角点响应函数大于某个阈值的像素点被认为是角点。

Harris 角点检测的优势在于它对图像的平移、旋转和尺度变化有较好的不变性,因此在计算机视觉领域中被广泛应用。检测到的角点通常用于图像匹配、物体识别、图像配准等应用。

对于角点的检测,harris依据一下直观判断:角点应该在窗口的各个方向都有变化,边界会在某个方向基本不变,而平坦区域在各个方向变化都小。

函数

cv2.cornerHarris(src, blockSize, ksize, k, dst, borderType)

  • src:数据类型为float32的输入图像
  • blockSize:角点检测中要考虑的领域大小
  • ksize:Sobel求导中使用的窗口大小
  • k:Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
  • dst:目标图像
  • borderType:边界类型
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
 
def plot(img, n):
    filename = img
    #读入图像并转化为float类型,用于传递给harris函数
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    # 输入图像必须是 float32 
    
    #对图像执行harris,最后一个参数在 0.04 到 0.05 之间
    dst = cv2.cornerHarris(gray, 2, 3, 0.04)
    
    # result is dilated for marking the corners, not important(腐蚀harris结果)
    dst = cv2.dilate(dst, None)
    
    # Threshold for an optimal value, it may vary depending on the image.(设置阈值)
    Threshold = 0.005*dst.max()
    img[dst > Threshold] = [255, 0, 0] # RGB,[0,0,255]表示该点为红色
    
    # 打印图像
    plt.subplot(1, 3, n), plt.imshow(img, cmap='gray'),
    plt.title('dst'), plt.axis('off')
 
 
plot('test30.jpg', 1)
plot('test30_1.jpg', 2)
plot('test30_2.jpg', 3)
 
plt.show()

# 一般方法
import cv2
import numpy as np


img = cv2.imread('./image/img2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)

img[dst > 0.1 * dst.max()] = [0, 0, 255]
cv2.imshow('dst', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


图像尺度空间

概念

尺度空间就是试图在图像领域中模拟人眼观察物体的概念与方法。

这是由于通过计算机视觉系统,我们无法直接获取所关注物体、对象的大小,这时候就需要一个尺度空间来描述。

在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么的容易,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是在图像在不同的尺度下都存在的特征点。

使之能在图像模糊的时候能识别出来是什么东西(教室里看到的清晰的班主任和球场上可以认出走过来的模糊人脸是班主任)

二维图像的尺度空间定义

在这里插入图片描述

局部不变性

对于目标物体,我们希望通过一些特征来描述它。比如车,可以选取车牌、轮廓等特征,对于人脸,则有五官、面型等特征。

分析图像物体时,我们关注的是目标与背景的差异性,局部不变性就是特征分析的重要性质。其包括:

  • 尺度不变性

    摄像头相对于物体远近呈现出来的物体尺寸不受其大小影响。 貌似说:就是不管你的物体大小如何,摄像头都可以改变目标物体的图像大小,只不过是摄像头放的远近问题。比如说:两个除了尺寸之外都一样的球,摄像头离大的球远一些,离小的球近一些,在某个点上,就会出现图像上两个球一样大小的情况。

  • 旋转不变性

    即若图像按下式进行变换(相当于所有坐标在极坐标下旋转θ角度):

在这里插入图片描述
在这里插入图片描述
图像的某些特征值不变,(某些函数值不变,如hu矩)

当这个物体发生旋转时,我们照样可以正确地辨认它,这就是所谓的旋转不变性(另外一个熟悉的具有旋转不变形的是拉普拉斯算子)

局部不变特征

全局特征:从整个图像中抽取的特征。较多的运用在图像检索领域,如图像颜色直方图。

局部特征:从图像的局部区域中抽取的特征(这个局部区域往往是图像中的一个像素及它周围的邻域)。

一种好的局部特征应该具有下面的特性:

  • 可重复性:同一个物体在不同时间,不同角度拍到图像中,检测到的特征对应的越多越好。
  • 独特性:特征在该物体上表现为独特性,能与场景下其他物体区分。
  • 局部性:特征往往是物体某个局部的特点,这样才可以避免遮挡时不能匹配的问题。
  • 数量性:检测到的特征数目一定要多,密集度最好能在一定程度上反映图像的内容。
  • 准确性:得到的特征应该能被精确定位,能够精确到像素。
  • 高效性:特征检测算法运算要快。

为了研究图像的尺度不变特征,我们需要先从图像的尺度空间理论开始。

当用一个机器视觉系统分析未知场景时,计算机没有办法预先知识图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。

所以在很多时候,我们会在将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征。比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸

SIFT算法

SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉中的特征提取算法,它具有尺度不变性和旋转不变性,因此在图像匹配、目标识别和图像配准等领域得到广泛应用。

SIFT 算法的主要步骤包括:

  1. 尺度空间极值检测: 在不同的尺度下,通过高斯滤波器构建图像的尺度空间金字塔,然后在每个尺度下检测局部极值点(关键点)。这些关键点代表图像中的显著特征。

  2. 关键点定位: 在检测到的极值点中,通过比较其尺度空间的局部邻域,选择稳定的关键点。这些关键点具有在尺度、位置和方向上的不变性。

  3. 方向分配: 为每个关键点分配主方向,使得该关键点对于旋转具有不变性。SIFT 使用梯度方向直方图来确定关键点的主方向。

  4. 关键点描述: 使用关键点周围的图像信息来创建描述符。描述符是一个向量,包含关键点周围区域的梯度信息。这些描述符是用于匹配关键点的特征。

SIFT 算法的优点包括对于尺度、旋转、光照变化等的不变性,以及对于局部图像区域的高判别性。然而,由于 SIFT 的计算量较大,因此在实时性要求较高的应用中可能会受到一些限制。

要点

检测到关键点 —(种子、直方图统计)—> 生成特征向量

让选择的特征点更加准确:把图像首先做一个金字塔,金字塔中每一层做不同的高斯滤波,让每一层图像进行不同程度的模糊,通过差分的方法选出最有价值的点,点的选择方法:DoG空间极值检测——在3X3的三维像素区域内(类似魔方)将中心点与周围26个像素点进行比较,得到候选关键点;但这些点是DOG空间的局部极值点,而且均为离散的点。故需要对这些点做曲线拟合操作,计算其极值点,从而实现关键点(特征点)的精确定位。补充完善:消除边界响应(Hessian矩阵)

得到特征点坐标后,接着要获取特征点的主方向,要先算出每个点坐标Location(x,y)的梯度的模m(x,y)以及方向θ(x,y),完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向,生成特征描述;为保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标旋转θ角度,即将坐标轴旋转为特征点的主方向;旋转之后以主方向为中心取8X8的窗口,求每个像素的梯度幅值和方向,找到一些种子点,基于这些种子,算出每一小块的直方图(8维向量),最终得到16X8=128维的向量。这样一个关键点就会产生128维的SIFT特征向量。

import cv2


img = cv2.imread('./image/img1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
# 注:新版本(对应py3.9)为sift = cv2. SIFT_create()


kp = sift.detect(gray, None)
# 找到关键点

img = cv2.drawKeypoints(gray, kp, img)
# 绘制关键点

cv2.imshow('sp',img)
cv2.waitKey(0)

在这里插入图片描述


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

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

相关文章

数据结构:链式栈

stack.h /* * 文件名称&#xff1a;stack.h * 创 建 者&#xff1a;cxy * 创建日期&#xff1a;2024年01月18日 * 描 述&#xff1a; */ #ifndef _STACK_H #define _STACK_H#include <stdio.h> #include <stdlib.h>typedef struct stack{int data…

FPGA物理引脚,原理(Pacakge and pinout)-认知3

画FPGA芯片引脚封装图&#xff08;原理&#xff09;&#xff0c;第一是参考开发板(根据一下描述了解总览&#xff09;&#xff0c;第二是研究Datasheet. ASCII Pinout File Zynq-7000 All Programmable SoC Packaging and Pinout(UG585) 1. Pacakge overview 1.1&#xff0…

爬虫案例—根据四大名著书名抓取并存储为文本文件

爬虫案例—根据四大名著书名抓取并存储为文本文件 诗词名句网&#xff1a;https://www.shicimingju.com 目标&#xff1a;输入四大名著的书名&#xff0c;抓取名著的全部内容&#xff0c;包括书名&#xff0c;作者&#xff0c;年代及各章节内容 诗词名句网主页如下图&#x…

ChatGPT Plus续费充值,到账延迟,如何申诉?

ChatGPT Plus充值总是到账延迟比较严重&#xff0c;一般多是通过充值链接代充值遇到&#xff0c;如果是账号登陆充值&#xff0c;是即时到账。但是有的客户不愿意提供账号密码&#xff0c;遇到延迟到账的情况如何解决呢&#xff1f;客户可按下面操作申诉&#xff0c;可快速到账…

Linux编译器--gcc和g++使用

gcc和g使用 一、gcc/g的作用1.1 预处理1.2 编译1.3 汇编1.4 链接 二、静态库和动态库三、make/Makefile3.1 make/Makefile3.2 依赖关系和依赖方法3.3 多文件编译3.4 make原理3.5 项目清理 四、linux下的第一个小程序-进度条4.1 行缓冲区的概念4.2 \r和\n4.3 进度条代码 一、gcc…

细讲Labview条件结构用法及易错点

本文讲解Labview条件结构的常用情景及易错点注意事项。帮助大家深刻理解并使用该结构&#xff0c;欢迎点赞关注加评论&#xff0c;有问题可以私聊或在下方评论区留言。 本文程序均附在文章结尾&#xff0c;可自行下载学习。 博主之前讲过Labview事件结构、For循环等的基础知识介…

SpringBoot连接远程服务器redis

SpringBoot连接远程服务器redis 1、指定redis配置启动 进入redis安装地址&#xff0c;我这里安装的是 /usr/local/src/redis-6.2.6 先copy一份配置文件 cp redis.conf redis.conf.bck然后修改配置文件信息 vim redis.conf bind 0.0.0.0 # 守护进程&#xff0c;修改为yes后即可…

Flutter中使用minio_new库

前言 在移动开发中&#xff0c;我们常常会遇到需要在App中处理文件上传和下载的需求。Minio是一个开源的对象存储服务&#xff0c;它兼容Amazon S3云存储服务接口&#xff0c;可以用于存储大规模非结构化的数据。 开始之前 在pubspec.yaml文件中添加minio_new库的依赖&#xf…

2023企业怎样抵御经济的不确定性?

在日益不确定的经济环境&#xff0c;继续业务照旧可能会超过陷入逆风的风险。要加入真正有复原力的企业行列&#xff0c;实现整个经济周期的增长&#xff0c;2023是时候发力业务创新&#xff1a;优化选择新的创新组合&#xff0c;洞察并发现新的创新机会&#xff0c;并发展新的…

Android Launcher3各启动场景源码分析

文章目录 一、概述二、开机启动Launcher2.1、开机启动Launcher流程图2.2、开机启动流程源码分析 三、短压Home键启动Launcher3.1、短压Home键启动Launcher流程图3.2、短压Home键启动Launcher源码分析 四、Launcher异常崩溃后的自启动4.1、Launcher异常崩溃后的自启动流程图4.2、…

C语言总结十三:程序环境和预处理详细总结

了解程序的运行环境可以让我们更加清楚的程序的底层运行的每一个步骤和过程&#xff0c;做到心中有数&#xff0c;预处理阶段是在预编译阶段完成&#xff0c;掌握常用的预处理命令语法&#xff0c;可以让我们正确的使用预处理命令&#xff0c;从而提高代码的开发能力和阅读别人…

在线扒站网PHP源码-在线扒站工具网站源码

源码介绍 这是一款在线的网站模板下载程序&#xff0c;也就是我们常说的扒站工具&#xff0c;利用它我们可以很轻松的将别人的网站模板样式下载下来&#xff0c;这样就可以大大提高我们编写前端的速度了&#xff01;注&#xff1a;扒取的任何站点不得用于商业、违法用途&#…

如何在CentOS 7 中基于OpenSSL 3.0 搭建Python 3.0 环境

1、OpenSSL 1.1 原因 [rootlocalhost ~]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 [rootlocalhost ~]#通过执行openssl version可知Linux系统已经安装了OpenSSL&#xff0c;但该版本较低&#xff1b;Python 3 要求 OpenSSL版本不能低于1.1.1&#xff0c;否则安装P…

【02】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在mapbox自带底图上 效果图&#xff1a; 形如这种地址去加载&#xff1a; http://zjq2022.gis.com:8080/demo/loadmapbox.html arcgis切片服务参考链接思路&#xff1a;【01】mapbox js api加…

【Copula】最可能场景详解

基于Copula联合分布的最可能场景详解 最可能场景&#xff08;The most-likely scenario&#xff09;实例探讨参考 最可能场景&#xff08;The most-likely scenario&#xff09; 相应英文介绍原理介绍如下&#xff1a;&#xff08;出自论文J2020-Drought hazard transferabilit…

RTC讲解

RTC&#xff08;Real Time Clock&#xff09;实时时钟 RTC实时时钟本质上是一个独立的定时器。RTC模块拥有一组连续计数的32位无符号计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配…

基于XG24-EK2703A的BLE HID蓝牙键盘+鼠标复合设备功能开发(BLE+HID+FreeRTOS+Gecko SDK)

目录 项目介绍硬件介绍项目设计开发环境及工程参考总体流程图硬件基本配置应用初始化按键中断回调定时器回调按键响应任务蓝牙事件回调BLE HIDReport Map及报文键盘设备鼠标设备复合设备 发送字符串上/下滚动 功能展示项目总结 &#x1f449; 【Funpack3-1】基于XG24-EK2703A的…

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …

C Primer Plus 第6版 编程练习 chapter 16

文章目录 1. 第1题1.1 题目描述1.2 编程源码1.3 结果显示 2. 第2题2.1 题目描述2.2 编程源码2.3 结果显示 3. 第3题3.1 题目描述3.2 编程源码3.3 结果显示 4. 第4题4.1 题目描述4.2 编程源码4.3 结果显示 5. 第5题5.1 题目描述5.2 编程源码5.3 结果显示 6. 第6题6.1 题目描述6.…

linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

前言&#xff1a; 目前服务器领域centos7基本是主流的操作系统&#xff0c;而linux相对于Windows来说&#xff0c;软硬件方面的支持是差很多的&#xff0c;在硬件方面来说&#xff0c;以一个免驱的网卡为例&#xff0c;window xp可能不会自动识别到&#xff0c;但Windows10基本…