12月13日 OpenCV 实战基础学习笔记——Harris、SIFT

news2024/11/25 12:48:06

文章目录


前言

本文为12月13日 OpenCV 实战基础学习笔记,分为两个章节:

  • Harri 角点检测;
  • SIFT。

一、Harris 角点检测

使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

1

1、公式推导

设窗口平移 [ U , V ] [U, V] [U,V] 产生灰度变化 E ( u , v ) E(u, v) E(u,v) :
E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v) = {\textstyle \sum_{x, y}} w(x, y)[I(x+u, y+v) - I(x, y)]^2 E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

其中:

  • u , v u, v u,v: 窗口偏移量;
  • x , y x, y x,y: 窗口内像素的坐标;
  • w ( x , y ) w(x, y) w(x,y): 窗口函数,内含权重信息,常用的有权重为1和呈二元高斯正太分布的权重;
  • I I I: 像素密度函数,类比与像素值.

2、找到 E ( u , v ) E(u, v) E(u,v) 的最大值

  • 泰勒展开式:
    f ( x + u , y + v ) ≈ f ( x , y ) + u f x ( x , y ) + v f y ( x , y ) f(x+u, y+v) \approx f(x, y) + uf_x(x, y) + vf_y(x, y) f(x+u,y+v)f(x,y)+ufx(x,y)+vfy(x,y)

所以:
∑ [ I ( x + u , y + v ) − I ( x , y ) ] 2 ≈ ∑ [ I ( x , y ) + u I x ( x , y ) + v I y ( x , y ) − I ( x , y ) ] 2 = ∑ u 2 I x 2 + 2 v u I x I y + v 2 I y 2 = ∑ [ u v ] [ I x 2 I x I y I x I y I y 2 ] [ u v ] M = ∑ x , y w ( x , y ) [ I x 2 I x I y I x I y I y 2 ] \sum [I(x+u, y+v) - I(x, y)]^2 \approx \sum [ I(x, y) + uI_x(x, y) + vI_y(x, y)- I(x, y)]^2 = \sum u^2 I_x^2 + 2vu I_x I_y + v^2 I_y^2 = \sum [uv]\begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix}\\ M = {\textstyle \sum_{x, y}}w(x, y) \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} [I(x+u,y+v)I(x,y)]2[I(x,y)+uIx(x,y)+vIy(x,y)I(x,y)]2=u2Ix2+2vuIxIy+v2Iy2=[uv][Ix2IxIyIxIyIy2][uv]M=x,yw(x,y)[Ix2IxIyIxIyIy2]

其中, ∑ x , y w ( x , y ) {\textstyle \sum_{x, y}}w(x, y) x,yw(x,y) 为窗口功能, I x , I y I_x, I_y Ix,Iy 分别为每个像素点 x 方向的强度和 y 方向的强度。 对 I x , I y I_x, I_y Ix,Iy 求偏导得:

  • λ 1 \lambda_1 λ1: X 轴方向的偏导的特征值;
  • λ 2 \lambda_2 λ2: Y 轴方向的偏导的特征值.

2

  • 代码如下:
    cv2.cornerHarris()
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img = cv.imread("./Harris_SIFT/test_1.jpg")
# img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

cv.imshow("Origin", img)
cv.waitKey(0) 
cv.destroyAllWindows()

3

img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
# img_gray = np.float32(img_gray)
dst = cv.cornerHarris(img_gray, 2, 3, 0.04)

print("dst.shape: ", dst.shape)
>>> dst.shape:  (800, 1200)
img[dst > 0.01 * dst.max()] = [0, 0, 255]

cv.imshow("Dst", img)
cv.waitKey(0) 
cv.destroyAllWindows()

4

二、SIFT

Scale-Invariant Feature Transform. 步骤主要分两步:

    1. 关键点定位 keypoint localisation;
    1. 特征描述 feature description.

1、关键点定位 keypoint localisation

  • 尺度空间极值检测: 通过使用高斯差分函数来计算并搜索所有尺度上的图像位置,用于识别对尺度和方向不变的潜在兴趣点。

5

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

  • 关键点精确定位: 通过一个拟合精细的模型在每个候选位置上确定位置和尺度,关键点的选择依赖于它们的稳定程度。

6

  • 方向匹配: 基于局部图像的梯度方向,为每个关键点位置分配一个或多个方向,后续所有对图像数据的操作都是相对于关键点的方向、尺度和位置进行变换,从而而这些变换提供了不变形。

2、特征描述 feature description

  • 使用直方图统计邻域内像素的梯度和方向:

7
为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ角度,即将坐标轴旋转为特征点的主方向。

8
旋转之后的主方向为中心取 8 × 8 8\times 8 8×8 的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个 4 × 4 4\times 4 4×4 的小块上绘制 8 个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,即每个特征的由 4 个种子点组成,每个种子点有 8 个方向的向量信息。

9

  • 代码如下:
import cv2 as cv
import numpy as np

img = cv.imread("./Harris_SIFT/test_1.jpg")
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

cv.imshow("Gray", img_gray)
cv.waitKey(0)
cv.destroyAllWindows()

10

# 得到特征点
sift = cv.SIFT_create()
kp = sift.detect(img_gray, None)

img = cv.drawKeypoints(img_gray, kp, img)
cv.imshow("Keypoints", img)
cv.waitKey(0)
cv.destroyAllWindows()

11

# 计算特征
kp, des = sift.compute(img_gray, kp)
print(np.array(kp).shape)

des.shape
>>> (6809, 128)

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

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

相关文章

docker安装Gitlab、修改密码、创建组、创建项目、创建用户、Git拉取代码

安装 建议内存大于2G 开放防火墙端口80和配置映射文件夹 firewall-cmd --zonepublic --add-port80/tcp --permanent firewall-cmd --reload mkdir -p /docker_data/gitlab/{data,logs,config}启动Gitlab容器(启动容器之前确保22,80,443端口没…

图解外包验收流程V2.0及详细说明实例

详细说明 01、【开发计划内容】-标准模板{文档} 1.包含二级模块开发计划,标注里程碑验收节点; 2.包含架构设计、数据库设计输出时间; 3.包含接口开发计划及其接口明细; 4.所有节点分配到具体的人和具体的开始结束时间&#xff1…

Python读取Word文档中的Excel嵌入文件

今天群友提出一个问题: 给出Word示例如下: 对于这种嵌入文件在Word中都属于ole文件。 下面我们假设需要读取每个嵌入的Excel文件中的python工作表中的A1单元格。 python调用宏实现 首先我们看看如何调用com接口的宏代码实现这个效果,最终完…

SpringBoot多模块项目初始化搭建

🎶 文章简介:SpringBoot多模块项目初始化搭建 💡 创作目的:详细介绍SpringBoot多模块项目的搭建 ☀️ 今日天气:阳光明媚 📝 每日一言:不求事事圆满,但求事事甘心。 文章目录1、新建…

数据结构与算法——Java实现单链表、双向链表、环型链表、约瑟夫

目录 一、单链表 1.1 单链表基本介绍 1.2 分析与实现带head头结点的单向链表 1.2.1第一种方式: 尾部添加元素示意图 1.2.2 尾部添加元素的代码实现以及遍历链表的实现 1.2.3 第二种方式: 根据排名将节点插入到指定位置的示意图 1.2.4 根据排名将节…

MySQL入门到精通经典50题,看这一篇就够了

MySQL入门到精通经典50题学习笔记 pdf获取方式,公众号:每天都要努力coding回复:mysql经典50题 文章目录MySQL入门到精通经典50题学习笔记[toc]MySQL安装教程详解数据预览sql建表语句1.查询" 01 “课程比” 02 "课程成绩高的学生的…

基于鸽群算法优化的lssvm回归预测-附代码

基于鸽群算法优化的lssvm回归预测 - 附代码 文章目录基于鸽群算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于鸽群算法优化的LSSVM4.测试结果5.Matlab代码摘要:为了提高最小二乘支持向量机(lssvm)的回归预测准确率,对…

你的项目需要自动化测试吗?看看这篇文章再说吧

什么是自动化测试? 通过代码的方式,实现测试用例的自动运行,评估运行结果,并对测试结果及异常情况进行记录。 为什么进行自动化测试? 纯手工测试会有好多重复性的操作,浪费时间,而且频繁的回…

央企招聘:中国大唐集团2023年度公开招聘公告

中国大唐集团科学技术研究总院有限公司(以下简称科研总院)是世界500强企业——中国大唐集团有限公司(以下简称集团公司)的全资子公司,是集团公司的科技创新中心、战略参谋本部、成果孵化中心、技术服务保障基地和科技人…

Qt+VS+VTK综合开发环境配置

说明 本文旨在介绍一种个人常用的开发环境,主要解决在VS中开发Qt项目的部分问题,以及解决使用基于Qt的VTK库开发时可能遇到的部分问题,并通过合理的配置提升新项目搭建时间 该教程使用版本为VS2017,Qt5.14.2以及VTK8.2&#xff…

git_No.1_版本管控的全流程

文章目录1.获取Git仓库1.1 已存在目录中初始化仓库1.2 克隆一个仓库2. 将变更提交到仓库2.1 查看当前文件状态2.2 跟踪新文件2.3 暂存已修改的文件2.4 忽略文件2.5 查看已暂存和未暂存的修改2.6 提交更新2.7 跳过使用暂存区2.8 移除文件3. 查看提交历史4.远程仓库4.1 查看远程仓…

HTTP介绍

目录 1.什么是HTTP? 2.HTTP的特点 3.HTTP的优点和缺点 4.HTTP请求数据格式 5.HTTP响应数据格式 6.GET请求和POST请求的区别 7.状态码分类说明 8.查看发送的请求数据包方式 1.什么是HTTP? Hyper Text Transfer Protocol,超文本传输协议&#xff…

[036]基于Vue+Nodejs的网上作业批改系统(含源码、数据库、万字课设报告)

文章目录一、项目介绍二、源码获取一、项目介绍 网络作业提交与批改系统:超强的作业批改项目,技术栈是VueNodeMysql,最重要的是有超详细的万字报告,一劳永逸,可冲~ 主要功能介绍: 1.管理员功能模块 管理员…

分享几个宝藏微信小程序

1.有数鸟:了解会员在各平台的消费明细 平时我们看视频听音乐,我们用的很多vip,你还记得你注册了哪些应用吗?有了这个小程序,就可以帮你记录每个平台的付款详情,以及总支出。 当我们添加会员项目时&#xff…

基于java+springboot+mybatis+vue+mysql的乒乓球预约管理系统

项目介绍 随着信息化时代的到来,管理系统都趋向于智能化、系统化,乒乓球馆预约管理系统 也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变…

基于C+++FLTK实现(WinForm)超市收银系统【100010032】

超市收银系统 Supermarket POS system 本次大作业是利用 C语言,基于 FLTK 图形库来设计超市收银系统。首先介绍程序的设计思想: 这套程序完全是基于题目所给的要求逐条逐步设计的。我把程序实现大致分为数据层面和图形层面。 数据层面: 程…

抖音视频怎么拼接?分享一款功能强大的软件

抖音视频怎么拼接?利用软件就很方便,所以抖音视频拼接可以通过操作简单的视频软件来辅助比较简单。就比如万兴喵影,就是一款操作简单、功能齐全的视频编辑器,很适合新手小白和半专业人士。 用万兴喵影做视频拼接,只需要…

扩散模型类似的方式训练text_to_text可不可以

🍿*★,*:.☆欢迎您/$:*.★* 🍿 正文 # 使用 64*64 图 写入 16号字体 16个字 # 每组数据 的 文字 是连续的 # 三张图组成一个训练 # 至少48 个字符训练一次 # 选择好自己的文本数据集

Springboot整合Netty,自定义协议实现

Springboot整合Netty&#xff0c;自定义协议实现 Springboot整合Netty 新建springboot项目&#xff0c;并在项目以来中导入netty包&#xff0c;用fastjson包处理jsonStr。 <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>…

Unity物理系统-物理材质-Collider碰撞体的弹力不够大如何处理

物理材质Physic Material&#xff1b; 当碰撞器发生碰撞的时候&#xff0c;具有该材质的游戏物体就会具有该材质的属性&#xff1b; Step1&#xff1a;在Project窗口下新建Physic Material&#xff08;命名为mat&#xff09;&#xff0c;并更改其弹力参数为1 Step2&#xff1a…