【Opencv入门到项目实战】(十一):harris角点检测|SIFT|特征匹配

news2025/2/28 11:32:00

所有订阅专栏的同学可以私信博主获取源码文件

文章目录

  • 1.harris角点检测
  • 2.尺度不变特征变换(SIFT)
    • 2.1图像尺度空间
    • 2.2 关键点定位
    • 2.3 消除边界响应
    • 2.4 代码示例

1.harris角点检测

这一节我们来讨论一下Harris角点检测,由Chris Harris和Mike Stephens于1988年提出。该算法通过计算图像的局部灰度变化来检测角点,并利用协方差矩阵的特征值来确定是否为角点。

它的基本思想是,对于图像I(x,y),当在点(x,y)处平移( Δ \Delta Δx, Δ \Delta Δy)后的灰度变化有多大。我们定义其变换后的自相似性为:

image-20230803160902306

w(x, y)是以点(x,y)为中心的一个窗口,一般我们用高斯窗口函数,用于平滑梯度。

然后对右边利用泰勒展开:

image-20230803160951244

其中,Ix和Iy分别表示图像在x和y方向上的梯度

代入后近似得到下列结果:

image-20230803161116510

其中M为协方差矩阵:

image-20230803163046978

接下来我们利用协方差的特征值来计算每个像素点的角点相响应值R

image-20230803163132552

其中,det(M)表示协方差矩阵M的行列式,trace(M)表示协方差矩阵M的迹, α \alpha α是一个常数,用于调整响应函数的灵敏度。

Opencv中,我们调用cv2.cornerHarris()函数实现

import cv2 
import numpy as np

# 导入图片
img = cv2.imread('test_1.jpg')
print ('img.shape:',img.shape)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)#转换为float32格式
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
print ('dst.shape:',dst.shape)

img.shape: (512, 512, 3)
dst.shape: (512, 512)
img[dst>0.01*dst.max()]=[0,0,255] #非极大值抑制,将边界点标红
cv2.imshow('dst',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

image-20230803212927010

上图可以看出,我们将当中的角点都检测出来了

Harris角点检测算法的优点在于它对旋转、尺度和亮度的变化具有一定的鲁棒性,并且适用于不同类型的图像。该算法还相对简单,计算速度较快。然而,Harris角点检测算法也存在一些限制。例如,它对侧向边缘非常敏感,会将边缘点误判为角点。此外,该算法对于纹理较为平滑的区域可能无法准确地检测到角点。

2.尺度不变特征变换(SIFT)

**Scale Invariant Feature Transform(SIFT)**是一种用于计算机视觉和图像处理中的特征检测和描述的算法,可以说是在计算机视觉一种非常流行和广泛使用的算法,它能够检测和描述图像中的关键点,并具有尺度、旋转和视角的不变性,适用于各种图像处理任务,例如目标识别、图像匹配、图像拼接等。SIFT算法主要包括:尺度空间检测、特征关键点检测、特征描述等,接下来我们来分别看一下这些概念

以下是对SIFT算法的详细介绍:

  1. 特征点检测:
    • 尺度空间极值检测:SIFT首先在不同尺度下使用高斯模糊滤波器构建尺度空间金字塔,然后通过比较每个像素与其周围像素及所处尺度上的像素进行检测,找到图像中的关键点。
    • 关键点精化:通过利用尺度空间的极值点,对关键点进行精化,计算其精确位置和尺度尺度,并根据梯度方向来确定主方向。
  2. 特征描述:
    • 局部图像描述子:以关键点为中心,在其周围的邻域内构建一个具有旋转不变性和尺度不变性的局部图像描述子。该描述子基于关键点附近的梯度方向和强度信息,通过生成一个特征向量来描述关键点周围的图像结构。
    • 方向直方图:在计算局部图像描述子之前,首先根据关键点周围的梯度方向计算一个方向直方图,用来确定主方向。
  3. 特征匹配:
    • 特征向量匹配:将两幅图像的特征向量进行匹配,通常使用最近邻匹配方法(如欧氏距离)来寻找每个特征点的最佳匹配。同时,还可以使用二次最近邻比率测试来过滤不可靠的匹配。
    • 鲁棒性和一致性:为了提高匹配的鲁棒性和一致性,可以使用诸如RANSAC(随机抽样一致性)等方法来剔除异常和错误的匹配点。

SIFT算法的关键优势在于其对尺度、旋转和视角的不变性,使得它能够在多种条件下鲁棒地检测和匹配图像中的特征点。此外,SIFT算法还具有以下特点:

  • 独特性:SIFT特征是在图像中独一无二的,它们可以用来区分不同的图像区域。
  • 不变性:SIFT特征对于有限的视角变化、尺度变化以及轻微的仿射变换都具有较好的不变性。
  • 高鲁棒性:SIFT算法对于光照变化、噪声和部分遮挡等情况下仍能产生准确的匹配结果。
  • 可扩展性:SIFT算法可以应用于各种图像尺寸和分辨率的图像,并且在大规模图像数据库中进行高效匹配。

,因此在目标识别、图像匹配和图像拼接等应用中具有重要的作用。

2.1图像尺度空间

我们知道在一定的范围内,无论物体是大还是小,我们人眼都可以分辨出来,然而计算机要有相同的能力却很难,所以要让机器能够对物体在不同尺度下有一个统一的认知,就需要考虑图像在不同的尺度下都存在的特点。

图像尺度空间是指在不同尺度下对图像进行分析和处理的一种表示方式。在图像尺度空间中,同一物体或结构的特征在不同尺度下具有不同的尺度信息。这是因为图像中的物体和结构可能以不同的尺度出现,例如大小、边缘和纹理等。通过在不同尺度下分析图像,我们可以获取更全面和鲁棒的特征表示,以适应不同尺度上的目标检测、识别和描述任务。

尺度空间的获取通常使用高斯模糊来实现,

image-20230809221841944

  • 高斯金字塔: 高斯金字塔是一种通过对图像进行连续的高斯滤波和下采样操作来构建图像尺度空间的方法。具体步骤如下:

    • 先对原始图像应用一个初始尺度的高斯滤波器。
    • 对滤波后的图像进行下采样(通常是进行二次减半),得到下一层金字塔图像。
    • 重复以上步骤,直到达到预定的尺度层数。
  • 多分辨率金字塔,它是通过将原始图像进行分解,得到一系列具有不同分辨率的图像层级,从而实现对图像的多尺度分析和处理通常采用逐步降采样(downsampling)和上采样(upsampling)的方法。

    • 首先,原始图像通过降采样操作被缩小为较低分辨率的图像,然后这个较低分辨率的图像再次进行降采样,直到达到所需的分辨率层级。
    • 这样就形成了一个金字塔状的层级结构,其中每个层级的图像都比上一层级的图像具有更低的分辨率。
    • 在每层进行高斯滤波器操作

    多分辨率金字塔的主要优势之一是可以在不同尺度下对图像进行分析。高层级的图像层级具有较低的分辨率,但能够捕捉到图像的整体特征和结构信息;而低层级的图像层级具有较高的分辨率,能够提供更多的细节信息。因此,通过在不同层级上对图像进行处理,可以获得更全面和准确的分析结果。

image-20230829185617231

  • 尺度空间差分金字塔: 尺度空间差分金字塔是基于高斯金字塔的构建方法。它通过计算高斯金字塔相邻层之间的差分图像来获取尺度空间的特征。这样做可以捕捉到图像中的细节信息,而较高尺度的层级可以揭示出图像中的整体结构。通过在不同层级上进行差分操作,可以凸显出图像中的边缘、角点等局部结构。具体步骤如下:
    • 构建高斯金字塔,并对每一层进行高斯平滑。
    • 对相邻两层图像进行差分操作,得到差分图像。
    • 重复以上步骤,直到达到预定的尺度层数。

image-20230829185556147

DOG定义:

image-20230830001359520

DoG空间极值检测

为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如下图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。

image-20230830001520780

2.2 关键点定位

这些候选关键点是DOG空间的局部极值点,而且这些极值点均为离散的点,精确定位极值点的一种方法是:对尺度空间DoG函数进行曲线拟合,计算其极值点,从而实现关键点的精确定位。

image-20230830001809889

我们使用泰勒展开来拟合,假设在0点展开,则具体表达式如下所示:

image-20230830001835576

用矩阵形式表示如下:

image-20230830001856211

2.3 消除边界响应

接下来得到了这些极值点具体位置之后,我们还需要对位置进行一些过滤,这里有一个方法就是消除边界响应。因为之前我们通过高斯滤波器对图像进行各种操作,可能会增加一些边界的响应,此时我们需要将其消除掉。

在这里啊,修正方法和我们之前介绍边缘检测类似,当一个特征值大,一个特征值小的时候,它就是边界,这里我们定义了一个 α \alpha α和一个 β \beta β α \alpha α=较大特征值, β \beta β=较小特征值,组成一个 H e s s i a n Hessian Hessian矩阵,具体如下:

image-20230830002922601

image-20230830003003981

γ > 10 \gamma>10 γ>10时,进行过滤操作。

2.4 代码示例

下面我们看如何在opencv中实现SIFT特征变换

==注意:==新版本的opencv不能直接调用,需要降版本为3.4.1,安装命令如下;

pip install opencv-python==3.4.1.15

pip install opencv-contrib-python==3.4.1.15

下面我们来看具体代码:

首先读取图片,这里我们还是使用之前的小狗洋气图片

import cv2
import numpy as np

img = cv2.imread('yangqi.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#灰度图

得到关键点:

接下来调用xfeatures2d.SIFT_create()函数初始化SIFT 检测器对象,然后使用detect()函数检测关键点

sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)#得到特征点

img = cv2.drawKeypoints(gray, kp, img) #绘制特征点

cv2.imshow('drawKeypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20230830103702934

计算特征:

接下来使用sift.compute()函数计算关键的及其对应的特征

kp, des = sift.compute(gray, kp)
  • kp:关键点

  • des:每一个关键点对应的特征

接下来我们来看一下他们的纬度

print(np.array(kp).shape) #kp是一个列表,需要转换成ndarray
print(des.shape)
(605,)
(605, 128)

结果表示我们一共得到了605个关键点,每个关键点是一个128维的向量。

🔎本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、订阅支持!!《Opencv入门到项目实战》

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

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

相关文章

论文分享丨西工大音频语音与语言处理研究组四篇论文被IEEE Trans. ASLP和SPL录用

近日,实验室三篇论文被语音研究顶级期刊IEEE/ACM Transactions on Audio, Speech and Language Processing (TASLP)录用,一篇论文被重要期刊IEEE Signal Processing Letters (IEEE SPL)录用,论文方向涉及说话人识别中的对抗攻击、基于扩散模型…

初学python(一)

一、python的背景和前景 二、 python的一些小事项 1、在Java、C中,2 / 3 0,也就是整数 / 整数 整数,会把小数部分舍掉。而在python中2 / 3 0.66666.... 不会舍掉小数部分。 在编程语言中,浮点数遵循IEEE754标准,不…

vscode中git的使用,以及与webstorm中git的使用对比

前言: 在项目中经常使用的git提交我们代码的时候,vscode和webstorm 是用的非常多的两个工具了,这里再次整理下他们的具体使用以及各自的优势! 1、初始化拉取项目 个人习惯,这里就不说框架用法了,原始的最简…

Python函数的概念以及定义方式

一. 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 二. 什么是函数? 假设你现在是一个工人,如果你实现就准备好了工具,等你接收到任务的时候, 直接带上工…

【安全】正则回溯绕过练习简单案例

目录 环境 案例1 前要 代码审计 分析 案例2 代码审计 分析 payload 环境 phpstudy 案例1 前要 php中0 1 -1 true false null 空字符 数组之间的比较 代码审计 <?php function areyouok($greeting){return preg_match(/Merry.*Christmas/is,$greeting); //2.传…

FP103 双运算放大器和参考调节器芯片

FP103 双运算放大器和参考调节器芯片 一般说明 FP103是一个由一个独立的运放器&#xff08;OPA2&#xff09;和另一个运放器&#xff08;OPA1&#xff09;组成&#xff0c;在非反相输入上具有2.5V精密电压参考&#xff0c;应用于许多应用&#xff0c;如电源、二流/直流转换器或…

python selenium控制浏览器打开网页 模拟鼠标动作

selenium 是一个浏览器控制的库 需要下载安装 谷歌浏览器的驱动 chromedriver https://sites.google.com/chromium.org/driver/downloads 在这里选择跟自己谷歌浏览器版本号一致的驱动程序 如果是最新的浏览器版本可以点这里下面这个链接 Chrome for Testing availability 选…

Web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

echo tail 与 重定向符

1.echo 命令 可以使用echo命令在命令行内输出指定内容 语法: echo输出的内容 无需选项&#xff0c;只有一个参数&#xff0c;表示要输出的内容&#xff0c;复杂内容可以用””包围其类似于 printf 函数 例子&#xff1a; 2. 反引号符 被包围的内容&#xff0c;会被作为命令…

SpringMVC_拦截器

4.拦截器 4.1拦截器概述 概述&#xff1a;一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行实际开发中&#xff0c;静态资源&#xff08;HTML/CSS&#xff09;不需要交给框架处理&#xff0c;需要拦截的是动态资源 4.2图示 图示 4.3案例实现 …

基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

介绍 本项目使用的技术栈是SSMlayuimysql&#xff0c;服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf/setting.xml中配置虚拟路径&#xff0c;本项目配置的是D:\upload 完整代码下载地址&#xff1a;图书借记管理系统 用户角色划分 游客 使用本系…

Scrum敏捷开发实施步骤和注意事项

在当今高度变化的时代&#xff0c;软件开发的环境和要求也在不断变化。传统的开发方法往往难以适应这种快速变化&#xff0c;因此&#xff0c;一种新的软件开发方法——敏捷开发逐渐得到了广泛的关注和应用。 敏捷开发的实施可以按照以下步骤进行&#xff1a; 1、明确产品愿景…

[贪心] 常见区间问题

1. 区间合并 先将区间进行排序&#xff0c;排序完后那么&#xff0c;区间合并就为以下三种情况 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end());int st,ed;vecto…

Mysql安装登录以及修改密码(8.0.33为例)windows版本

一、下载和解压 1.下载开源免费版本 2.将下载的zip文件解压到电脑下我的是d盘Program Files 注意不要有中文目录 3.在mysql的安装目录下创建mysql的配置文件my.ini并且新建data数据目录 [mysqld]#port port3306# set basedir to your installation path basedirD:\\Program Fi…

使用CUDA计算GPU的理论显存带宽

文章目录 一、显存带宽和理论显存带宽1. 显存带宽2. 理论显存带宽1&#xff09;计算公式2&#xff09;举例 二、利用CUDA计算理论显存带宽 一、显存带宽和理论显存带宽 1. 显存带宽 显存带宽是指显存和GPU计算单元之间的数据传输速率。 显存带宽越大&#xff0c;意味着数据传…

AI 编程助手 Amazon CodeWhisperer 使用(持续更新中)

文章作者&#xff1a;天博 近期 chatGPT 非常火爆&#xff0c;试用一些公众号功能&#xff0c;及自己接入的 chatGPT&#xff0c;写小作文能力一流&#xff0c;但是准确率很低&#xff0c;一直在搜寻可以在 idea 中使用&#xff0c;且非常丝滑的 AI 编程工具&#xff0c;前不久…

开源免费高颜值音乐播放器 无广告-BlackHole

BlackHole是什么 BlackHole是一个开源免费且高颜值的音乐播放器&#xff0c;简约无广告&#xff0c;目前聚合Saavn、Spotify、YtMusic 和 YouTube 平台音乐&#xff0c;支持从 Spotify 和 YouTube 导入播放列表&#xff0c;支持15音乐语言&#xff0c;最佳流媒体质量 支持320k…

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

Node.js 操作百度网盘实现文件上传&#xff08;小文件上传&#xff0c;大文件分片上传&#xff09; 前提准备&#xff1a;获取百度网盘的授权码 https://pan.baidu.com/union/doc/al0rwqzzl const fs require(fs); const crypto require(crypto); const path require(pat…

解某麦数据请求参数analysis加密

意外发现一个可以查询app下载量得网站&#xff0c; 想筛选一下哪些下载量在1w-10w之间&#xff0c;大概需要5k个.。 感觉应该没啥加密&#xff0c;好把&#xff0c;是我小看了&#xff0c;有个参数是加密得&#xff0c;如图。 analysis 扣js开始&#xff0c; f12 去资源文件…

AP5125 外置MOS LED降压恒流驱动器 过EMC认证 车灯驱动线路图

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式&#xff0c; 利用平均电流检测模式&#xff0c;因此具有优异的负载调整 率…