文章目录

  • 一、什么是图像金字塔?
  • 二、图像金字塔的核心操作:采样与逆采样
    • 1. 向下采样(pyrDown):从高分辨率到低分辨率
      • 步骤1:高斯滤波
      • 步骤2:删除偶数行与偶数列
      • OpenCV实战代码
      • 效果特点
    • 2. 向上采样(pyrUp):从低分辨率到高分辨率
      • 步骤 1:插值补全像素
      • 步骤 2:高斯滤波
      • OpenCV 实战代码
      • 效果特点
  • 三、拉普拉斯金字塔:捕捉采样丢失的细节
    • 1. 拉普拉斯金字塔的定义
    • 2. 拉普拉斯金字塔的核心作用:图像恢复与融合
      • OpenCV 实战:图像恢复
      • 效果特点
  • 四、图像金字塔的典型应用场景
    • 1. 特征点提取(SIFT、ORB 等)
    • 2. 模板匹配
    • 3. 图像融合
    • 4. 光流跟踪
  • 五、总结与注意事项
    • 核心知识点
    • 注意事项
    • 注意事项

在计算机视觉领域,如何高效处理不同尺度下的图像信息,是实现 目标检测、特征提取、图像融合等任务的关键。图像金字塔(Image Pyramid)作为一种经典的多分辨率表示方法,通过将图像分解为不同分辨率的子图集合,为解决上述问题提供了简洁而强大的思路。本文将从图像金字塔的基本概念出发,深入解析其核心操作(向下采样与向上采样)、数学原理,并结合OpenCV实战代码与典型应用场景,带你全面掌握这一技术。


一、什么是图像金字塔?

图像金字塔是由同一幅图像的多个不同分辨率子图构成的集合,因其层级结构形似“金字塔”而得名。其核心特征如下:

  • 层级关系:金字塔的底部是原始高分辨率图像(记为G₀),向上每一层(G₁、G₂、…、Gₙ)的分辨率都逐步降低,顶部可能仅保留1个像素点。
  • 分辨率变化规律:通常每向上移动一层,图像的宽度和高度会缩小为前一层的1/2,像素总数减少为1/4(也可根据需求调整缩放比例)。
  • 核心作用:将单分辨率图像转化为多尺度表示,让算法能在不同“尺度”下分析图像(例如大尺度检测目标整体,小尺度捕捉细节)。

示例:若原始图像为512×512(G₀),经过1次向下采样得到256×256的G₁,再采样得到128×128的G₂,以此类推,最终形成“底层大、上层小”的金字塔结构。
在这里插入图片描述


二、图像金字塔的核心操作:采样与逆采样

图像金字塔的构建依赖两种基础操作:向下采样(降采样)向上采样(升采样)。这两种操作是金字塔分层的核心,但需注意:

它们并非可逆过程——对图像先降采样再升采样,无法恢复原始图像的细节(会丢失信息)。

1. 向下采样(pyrDown):从高分辨率到低分辨率

向下采样是构建高斯金字塔的核心步骤,目的是降低图像分辨率,生成金字塔的上一层子图。其操作遵循“先滤波、再抽样”的原则,具体流程如下:

步骤1:高斯滤波

首先对当前图像(如G₀)进行高斯模糊处理。这一步的核心目的是抑制高频噪声——若直接删除像素,会导致图像边缘出现锯齿或伪影,高斯滤波通过对邻域像素加权平均,平滑图像并保留主要结构。

高斯滤波的权重由二维高斯函数决定:
G(x,y)=12πσ2e−x2+y22σ2G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2
其中,σ为高斯核的标准差(控制模糊程度),通常使用3×3或5×5的高斯核(如3×3核:[121242121]\begin{bmatrix}1&2&1\\2&4&2\\1&2&1\end{bmatrix}121242121,需归一化后使用)。

步骤2:删除偶数行与偶数列

对滤波后的图像,删除所有偶数行和偶数列。例如512×512的图像经此操作后,变为256×256(宽度和高度各减半),像素总数变为原来的1/4。

OpenCV实战代码

import cv2# 读取原始灰度图像(G0)
img = cv2.imread("face.png", cv2.IMREAD_GRAYSCALE)
cv2.imshow("Original (G0)", img)
cv2.waitKey(0)# 第一次向下采样(G1:256×256)
img_down1 = cv2.pyrDown(img)
cv2.imshow("Down Sample 1 (G1)", img_down1)
cv2.waitKey(0)# 第二次向下采样(G2:128×128)
img_down2 = cv2.pyrDown(img_down1)
cv2.imshow("Down Sample 2 (G2)", img_down2)
cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

效果特点

  • 分辨率降低,尺寸缩小;
  • 因高斯滤波和平滑,图像整体更模糊,细节(如边缘、纹理)逐渐丢失;
  • 每一层都保留了前一层的“概览信息”(如目标的整体形状)。

2. 向上采样(pyrUp):从低分辨率到高分辨率

向上采样是向下采样的逆操作,目的是恢复图像分辨率(生成比当前层更大的子图),但无法恢复向下采样时丢失的细节。其操作流程为“先插值、再滤波”:

步骤 1:插值补全像素

对当前低分辨率图像(如 G₁),在每个像素的行和列之间插入 0 值。例如 256×256 的图像经此操作后,变为 512×512——新图像的宽度和高度翻倍,但插入的 0 值会导致图像出现“网格状”空洞。

步骤 2:高斯滤波

用与向下采样相同的高斯核(需放大 4 倍以匹配像素密度)对插值后的图像进行滤波,填充空洞并平滑图像。例如 3×3 高斯核需调整为 [121242121]\begin{bmatrix}1&2&1\\2&4&2\\1&2&1\end{bmatrix}121242121(与向下采样核一致,因插值后像素密度变为原来的 1/4,核权重需保持对应)。

OpenCV 实战代码

# 对G1进行向上采样(恢复为512×512,但细节丢失)
img_down1_up = cv2.pyrUp(img_down1)
cv2.imshow("Down1 -> Up (G1')", img_down1_up)
cv2.waitKey(0)# 对比原始图像与“降采样+升采样”结果
cv2.imshow("Original (G0)", img)
cv2.imshow("Down1 -> Up (G1')", img_down1_up)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

效果特点

  • 尺寸与原始图像一致(如 512×512),但清晰度远低于原始图像
  • 因丢失的高频细节无法恢复,图像整体偏模糊,边缘过渡不锐利;
  • 验证了 “采样不可逆” 的特性 —— 降采样丢失的信息无法通过升采样完全找回。

三、拉普拉斯金字塔:捕捉采样丢失的细节

既然向下采样会丢失细节,如何保留这些信息以便后续恢复图像?拉普拉斯金字塔(Laplacian Pyramid) 应运而生。它通过计算 “原始图像与‘降采样后再升采样’图像的差值”,记录每一层向下采样时丢失的高频细节(边缘、纹理等)。

1. 拉普拉斯金字塔的定义

拉普拉斯金字塔的第 i 层(LiL_iLi)计算公式为:
Li=Gi−pyrUp(pyrDown(Gi))L_i = G_i - \text{pyrUp}(\text{pyrDown}(G_i)) Li=GipyrUp(pyrDown(Gi))
其中:

  • GiG_iGi:高斯金字塔的第 i 层(原始或降采样后的图像);
  • pyrUp(pyrDown(Gi))\text{pyrUp}(\text{pyrDown}(G_i))pyrUp(pyrDown(Gi)):对 GiG_iGi 先降采样再升采样的结果(尺寸与 GiG_iGi 一致,但细节丢失);
  • LiL_iLi:差值图像,记录了 GiG_iGi 中被降采样丢失的高频细节(边缘、纹理等)。

示例

  • L0=G0−pyrUp(pyrDown(G0))L_0 = G_0 - \text{pyrUp}(\text{pyrDown}(G_0))L0=G0pyrUp(pyrDown(G0)) → 记录 G0G_0G0G1G_1G1 丢失的细节;
  • L1=G1−pyrUp(pyrDown(G1))L_1 = G_1 - \text{pyrUp}(\text{pyrDown}(G_1))L1=G1pyrUp(pyrDown(G1)) → 记录 G1G_1G1G2G_2G2 丢失的细节;
  • 以此类推,拉普拉斯金字塔的顶层为高斯金字塔的顶层(无更高层可采样)。

2. 拉普拉斯金字塔的核心作用:图像恢复与融合

拉普拉斯金字塔的最大价值在于恢复高分辨率图像。通过“高斯金字塔的高层图像 + 拉普拉斯金字塔的对应细节”,可逐步重建原始图像:

  1. 从高斯金字塔顶层 GnG_nGn 开始,对其进行升采样:pyrUp(Gn)\text{pyrUp}(G_n)pyrUp(Gn)
  2. 加上拉普拉斯金字塔的 Ln−1L_{n-1}Ln1 层,得到 Gn−1G_{n-1}Gn1:$ G_{n-1} = \text{pyrUp}(G_n) + L_{n-1} $;
  3. 重复步骤 1 - 2,直到恢复出原始图像 G0G_0G0

OpenCV 实战:图像恢复

# 计算拉普拉斯金字塔L0和L1
L0 = img - cv2.pyrUp(img_down1)  # G0 - pyrUp(G1)
L1 = img_down1 - cv2.pyrUp(img_down2)  # G1 - pyrUp(G2)# 显示拉普拉斯细节(黑色背景下的白色边缘,即丢失的细节)
cv2.imshow("Laplacian L0", L0)
cv2.imshow("Laplacian L1", L1)
cv2.waitKey(0)# 用L0恢复原始图像:pyrUp(G1) + L0 = G0
recovered_img = cv2.pyrUp(img_down1) + L0
cv2.imshow("Recovered Image (G0)", recovered_img)
cv2.imshow("Original Image (G0)", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果特点

  • 拉普拉斯图像(L0L_{0}L0L1L_{1}L1)以 “黑色背景 + 白色边缘” 为主,直观展示了各层丢失的细节;
  • 恢复后的图像与原始图像几乎一致(微小差异来自数值精度),验证了拉普拉斯金字塔的细节保留能力。

四、图像金字塔的典型应用场景

图像金字塔的多尺度特性使其成为计算机视觉的基础工具,广泛应用于以下场景:

1. 特征点提取(SIFT、ORB 等)

SIFT(尺度不变特征变换)是经典的特征提取算法,其核心是“在不同尺度下检测稳定的特征点”。图像金字塔为 SIFT 提供了多尺度基础:

  • 对原始图像构建高斯金字塔(不同 σ 的模糊图像);
  • 计算相邻层的差值(高斯差分金字塔,DoG),检测极值点(潜在特征点);
  • 结合拉普拉斯金字塔的细节,筛选出尺度不变的特征点,用于图像匹配、目标识别。

2. 模板匹配

模板匹配是在大图像中寻找与小模板相似区域的任务。若直接在原始图像中匹配,可能因“模板与目标尺度不一致”导致匹配失败。图像金字塔的解决方案是:

  1. 对原始图像和模板分别构建金字塔;
  2. 从金字塔顶层(低分辨率)开始匹配,快速定位大致区域;
  3. 逐步向下层(高分辨率)细化匹配,提高精度。

这种“从粗到细”的匹配方式,既提升了速度,又解决了尺度不一致问题。

3. 图像融合

在图像拼接(如全景图)或曝光融合中,需将多幅图像的重叠区域平滑过渡。图像金字塔的融合流程为:

  1. 对每幅图像构建高斯金字塔(获取不同尺度的概览);
  2. 构建对应的拉普拉斯金字塔(获取不同尺度的细节);
  3. 在拉普拉斯金字塔的每一层,对重叠区域进行加权融合(如左侧图像权重从 1→0,右侧从 0→1);
  4. 从融合后的拉普拉斯金字塔顶层开始,逐步向上恢复,得到最终融合图像。

优势:可避免融合边缘出现 “拼接痕迹”,实现平滑过渡。

4. 光流跟踪

光流跟踪用于检测视频中运动目标的 “瞬时速度”。由于目标可能在视频中缩放(如靠近 / 远离摄像头),需在多尺度下跟踪:

  • 对视频的连续帧构建图像金字塔;
  • 在顶层(低分辨率)跟踪目标的大致运动方向;
  • 向下层(高分辨率)细化跟踪位置,提高精度;
  • 结合各层结果,得到目标在原始分辨率下的光流向量。

五、总结与注意事项

图像金字塔作为计算机视觉的基础技术,其核心价值在于将单分辨率图像转化为多尺度表示,解决了 “尺度不一致”“细节与概览平衡” 等关键问题。

核心知识点

  1. 高斯金字塔:通过 “向下采样” 构建,每一层都是前一层的低分辨率平滑版本,用于获取图像的概览信息;
  2. 向上采样:恢复图像尺寸但无法恢复细节,验证了 “采样不可逆”;
  3. 拉普拉斯金字塔:记录向下采样丢失的细节,用于图像恢复与融合;
  4. 应用场景:特征提取(SIFT)、模板匹配、图像融合、光流跟踪等。

注意事项

  • 分辨率变化:默认每一层的宽 / 高为前一层的 1/2,需注意图像尺寸需为 2 的整数次幂(如 512、256),否则可能出现尺寸偏差;
  • 噪声影响:向下采样前的高斯滤波需合理选择 σ(过小易保留噪声,过大易模糊细节);
    录向下采样丢失的细节,用于图像恢复与融合;
  1. 应用场景:特征提取(SIFT)、模板匹配、图像融合、光流跟踪等。

注意事项

  • 分辨率变化:默认每一层的宽 / 高为前一层的 1/2,需注意图像尺寸需为 2 的整数次幂(如 512、256),否则可能出现尺寸偏差;
  • 噪声影响:向下采样前的高斯滤波需合理选择 σ(过小易保留噪声,过大易模糊细节);
  • OpenCV 函数细节cv2.pyrDown()cv2.pyrUp()dstsize参数可自定义输出尺寸,但需遵循 “向下采样为 1/2,向上采样为 2 倍” 的原则,否则会导致后续计算错误。

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

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

相关文章

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS?二、四层(L4)负载均衡的最佳解决方案是什么?2.1解决方案分类与对比(负载均衡的三种方式介绍)2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker:如果将kafka比喻成数据仓库网络,那么Broker就是网络中的仓库节点,比如快递站,在该节点内可以独立运行,并且多个Broker可以连接起来,构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置,往往决定成败。在软件开发的世界里,环境变量就像是一位无声的指挥家,默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言,正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示,基于示例代码逻辑,结合格式兼容性、功能实现步骤及多样化显示方式,适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树(排序树)1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…

LeetCode 刷题【73. 矩阵置零】

73. 矩阵置零 自己做 解&#xff1a;标记消除 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {vector<bool> x(matrix.size(), false); //要置0的行vector<bool> y(matrix[0].size(), false); //…

Unity学习----【进阶】TextMeshPro学习(一)--基础知识点

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.导入TextMeshPro 对于新创建的工程&#xff0c;可以直接在这里导入TMP必要的资源&#xff08;上面&#xff09;&#xff0c;以及TMP的实例和扩展&#xff08;下面&#xff09; 导入之…

BigDecimal(用于处理超出double范围的浮点数)

BigDecimal 是 Java 中 java.math 包提供的高精度十进制浮点数类&#xff0c;专为解决基本类型&#xff08;float/double&#xff09;的精度缺陷而设计&#xff0c;广泛用于金融、科学计算等对精度要求极高的场景。以下从核心特性、使用方法、常见问题对比、注意事项等方面详细…

Nginx 优化

文章目录1、隐藏版本号2、修改用户与组3、缓存时间4、日志切割5、连接超时6、更改进程数7、配置网页8、防盗链1、隐藏版本号 隐藏nginx的版本号&#xff0c;为了防止恶意用户利用已知漏洞进行攻击 ## 查看版本号 curl -I http://192.168.10.23方法一&#xff1a;修改配置文件…

基于多模态与主动学习的车船飞机图像识别系统研究与应用技术方案

技术方案 一、技术背景与研究现状 图像识别是计算机视觉的核心任务之一&#xff0c;随着深度学习的发展&#xff0c;基于 卷积神经网络&#xff08;CNN&#xff09; 与 视觉Transformer&#xff08;ViT&#xff09; 的图像分类方法已成为主流。 根据《图像分类技术选型——截止…

Word2Vec词嵌入技术和动态词嵌入技术

Word2Vec&#xff08;Word to Vector&#xff09;是 2013 年由 Google 团队提出的无监督词嵌入模型&#xff0c;是一种静态词嵌入技术&#xff0c;核心目标是将自然语言中的离散词汇映射为低维、稠密的实数向量&#xff08;即 “词向量”&#xff09;&#xff0c;让向量空间的距…

Netty从0到1系列之Netty逻辑架构【上】

文章目录一、Netty逻辑架构【上】1.1 网络通信层1.1.1 BootStrap & ServerBootStrap1. ✅核心方法链与配置2. ✅ 架构与流程3. ✅ 底层实现与原理分析4. ✅ 实践经验与总结1.1.2 Channel1.2 事件调度层1.2.1 事件调度层概述1.2.2 EventLoop【事件循环】1.2.3 EventLoopGrou…

Spring Cloud 高频面试题详解(含代码示例与深度解析)

文章目录Spring Cloud 高频面试题详解&#xff08;含代码示例与深度解析&#xff09;1. 什么是 Spring Cloud&#xff1f;它与 Spring Boot 有什么关系&#xff1f;2. 服务发现&#xff1a;Eureka 和 Nacos 的区别与选型&#xff1f;Eureka 示例与原理Eureka vs Nacos 对比表3.…

Ascend310B重构驱动run包

在Atlas 200I AI加速模块(Ascend310B)移植过程中如需要将自己编译的Image、dt.img及内核模块打包到启动镜像包中需要对"Ascend-hdk-310b-npu-driver-soc_<version>_linux-aarch64.run"(下面统称驱动run包)进行重构。下面将介绍如何重构run包。 重构驱动run包需…

Leecode hot100 - 287. 寻找重复数

题目描述 287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…

机器人控制器开发(驱动层——奥比大白相机适配)

文章总览 编译OrbbecSDK_ROS2的代码 执行命令 colcon buildros2 launch orbbec_camera dabai.launch.py问题1&#xff1a; 运行时报错&#xff1a; [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not…

`vcpkg` 微软开源的 C/C++ 包管理工具的使用和安装使用spdlog

vcpkg 是 微软开源的 C/C 包管理工具&#xff0c;类似于 Python 的 pip、Node.js 的 npm、Rust 的 cargo。 它的主要作用是&#xff1a;帮助你快速下载、编译、安装和管理 C/C 第三方库&#xff0c;并自动配置到你的项目&#xff08;比如 Visual Studio、CMake、MSBuild&#x…

Mysql 幻读详解

我们来详细地聊一聊 MySQL InnoDB 中的“幻读”&#xff08;Phantom Read&#xff09;问题。这是一个在数据库事务隔离中非常核心且有时令人困惑的概念。 我会从定义、例子、原因以及解决方案几个方面来彻底讲清楚。 1. 什么是幻读&#xff1f; 官方定义&#xff1a;幻读指的…

如何生成 GitHub Token(用于 Hexo 部署):保姆级教程+避坑指南

如何生成 GitHub Token&#xff08;用于 Hexo 部署&#xff09;&#xff1a;保姆级教程避坑指南 前置说明&#xff1a;为什么需要 GitHub Token&#xff1f; 在使用 Hexo 部署博客到 GitHub Pages 时&#xff0c;你可能会遇到「密码验证失败」或「需要双重验证」的问题——这…

常用加密算法之 AES 简介及应用

相关系列文章 常用加密算法之 SM4 简介及应用常用加密算法之 RSA 简介及应用 引言 AES&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09;是一种​​广泛使用的对称分组加密算法​​&#xff0c;它使用相同的密钥进行加密和解密操作&#xff0c…