当前位置: 首页 > news >正文

OpenCV进阶操作:图像金字塔

文章目录

  • 前言
  • 一、图像金字塔
    • 1、什么是图像金字塔
    • 2、金字塔类型
      • 1) 高斯金字塔 (Gaussian Pyramid)
      • 2)拉普拉斯金字塔 (Laplacian Pyramid)
    • 3、图像金字塔的作用
  • 二、图像金字塔中的操作
    • 1、向下采样
      • 步骤
    • 2、向上采样
      • 步骤
    • 3、拉普拉斯金字塔
    • 4、结论
  • 三、代码实现
    • 1、高斯金字塔向下采样
    • 2、高斯金字塔向上采样
    • 3、向下采样再向上采样
    • 4、拉普拉斯金字塔
  • 总结


前言

在计算机视觉领域,图像金字塔是一种重要的多尺度表示方法。通过构建图像金字塔,我们可以高效地处理不同分辨率下的图像特征。OpenCV作为最流行的计算机视觉库,提供了便捷的图像金字塔实现方法。本文将深入解析图像金字塔的原理,并通过Python代码演示其实际应用


一、图像金字塔

1、什么是图像金字塔

图像金字塔是通过对原始图像进行多尺度**下采样(缩小)上采样(放大)**得到的图像集合。其名称来源于金字塔状的分层结构,每一层都是对前一层分辨率按比例缩放的结果。这种结构可以帮助我们在不同尺度下分析图像特征,常用于目标检测、图像融合等任务。
在这里插入图片描述

2、金字塔类型

1) 高斯金字塔 (Gaussian Pyramid)

  • 原理:通过不断进行高斯模糊和下采样生成
  • 向下采样(缩小):

  • 应用高斯滤波器(5×5卷积核)

  • 删除偶数行和列(分辨率减半)

  • 向上采样(放大):

  • 将图像尺寸扩大两倍(新增像素初始化为0)

  • 应用高斯滤波器进行近似插值

2)拉普拉斯金字塔 (Laplacian Pyramid)

  • 原理:通过高斯金字塔不同层级的差值构建,用于图像重建

  • 公式:L_i = G_i - PyrUp(G_{i+1})

  • 存储的是不同尺度下的细节信息

3、图像金字塔的作用

  • 特征点提取

图像金字塔允许在不同尺度下检测特征点,提高特征点检测的尺度不变性。

  • 模板匹配

图像金字塔帮助处理不同尺度的模板匹配问题,提高匹配的准确性。

  • 光流跟踪

通过在不同尺度层中估计光流,图像金字塔帮助处理大范围的运动,提高光流估计的精度。

二、图像金字塔中的操作

1、向下采样

向金字塔顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下,每向上移动一级,图像的宽和高都降低为原来的1/2。

步骤

  1. 高斯滤波(减少高频噪声)
  2. 删除其偶数行和偶数列(所以所用图像一般高宽都是偶数)
  3. OpenCV函数cv2.pyrDown()
    在这里插入图片描述

2、向上采样

通常将图像的宽度和高度都变为原来的2倍。这意味着,向上采样的结果图像的大小是原始图像的4倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为插值。

步骤

  1. 插值
  2. 高斯滤波(减少由于插值产生的人工边界和不自然的过渡)
  3. OpenCV函数cv2.pyrUp()
    在这里插入图片描述

3、拉普拉斯金字塔

为了在向上采样是能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构
成了拉普拉斯金字塔。也是拉普拉斯金字塔是有向下采样时丢失的信息构成。
在这里插入图片描述
在这里插入图片描述

4、结论

通过以上分析可知,向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作并不
是可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、
再向上采样也无法恢复到原始状态。

三、代码实现

  • 关键API说明

  • cv2.pyrDown(src):向下采样

  • cv2.pyrUp(src):向上采样

  • 注意:pyrUp不是pyrDown的完美逆运算,会丢失部分信息。

1、高斯金字塔向下采样

使用cv2.pyrDown()函数实现向下采样

import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,image):cv2.imshow(name,image)cv2.waitKey(0)
'''------------高斯金字塔操作中的向下采样-------------'''face = cv2.imread('pyy.jpg',cv2.IMREAD_GRAYSCALE)#G0
cv_show('face',face)
face_down_1 = cv2.pyrDown(face)#下采样G1
cv_show('down_1',face_down_1)
face_down_2 = cv2.pyrDown(face_down_1)
cv_show('down_2',face_down_2)

可以看出逐层递减的效果非常明显
在这里插入图片描述

2、高斯金字塔向上采样


```python
import cv2  # opencv读取的格式是BGR2# 高斯金字塔操作中的向上采样
# dst = cv2.pyrUp(src [,dst, dstsize [, borderType] ])
# dst:目标图像
# #src:原始图像
# dstsize:目标图像的大小
face = cv2.imread('face.jpg')  # G0
face = cv2.resize(face, (400, 400))
cv2.imshow('face', face)
cv2.waitKey(0)
face_up_1 = cv2.pyrUp(face)
cv2.imshow('face_up_1', face_up_1)  # G1
cv2.waitKey(0)
face_up_2 = cv2.pyrUp(face_up_1)
cv2.imshow('face_up_2', face_up_2)  # G2
cv2.waitKey(0)
cv2.destroyAllWindows()

向上采样之后的图像宽高逐层变成2倍

在这里插入图片描述

3、向下采样再向上采样

  • 对下采样后图像进行上采样,图像变模糊,无法复原
  • 对上采样后图像进行下采样,图像变模糊,无法复原
face_down_1_up = cv2.pyrUp(face_down_1)  # 下采样G1
face_up_1_down = cv2.pyrDown(face_up_1)  # 上采样G1
cv2.imshow('yuantu', face)
cv2.imshow('down_1_up', face_down_1_up)
cv2.imshow('up_1_down', face_up_1_down)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 处理后的图像与原图相比变得模糊
    在这里插入图片描述

4、拉普拉斯金字塔

L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_upfuyuan = face_down_1_up + L0
cv_show('L0',L0)
cv_show('l1',L1)
cv_show('fuyuan',fuyuan)
  • 可以看到拉普拉斯金字塔的复原效果还是不错的
  • 我这里使用的是彩色图片,所以拉普拉斯图像是彩色的
  • 如果使用的图片是灰度图,那么就是黑白的
    在这里插入图片描述

总结

图像金字塔为多尺度图像处理提供了高效解决方案。通过OpenCV的简单API,我们可以轻松实现:

  • 创建不同分辨率的图像层级

  • 提取多尺度特征

  • 实现自然的图像融合效果

实际开发中,金字塔技术常与特征检测算法(如SIFT、ORB)结合使用。读者可以尝试调整金字塔层数,或结合边缘检测算法探索更多应用场景

http://www.xdnf.cn/news/170569.html

相关文章:

  • Django(快速上手版)
  • IDEA中使用Git
  • 物联网相关
  • 【仿Mudou库one thread per loop式并发服务器实现】服务器边缘测试+性能测试
  • 强制缓存vs协商缓存
  • pycharm无法创建venv虚拟环境
  • Web安全:威胁解析与综合防护体系构建
  • 快速排序及其在Unity游戏开发中的应用
  • Node.js API 安全的主要策略:最佳实践
  • 面试记录1-春招补录0427
  • 【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
  • FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍
  • Reverse-WP记录6
  • Taro on Harmony :助力业务高效开发纯血鸿蒙应用
  • 云计算市场的重新分类研究
  • 华为 MRAG:多模态检索增强生成技术论文阅读
  • 用Node.js施展文档比对魔法:轻松实现Word文档差异比较小工具,实现Word差异高亮标注(附完整实战代码)
  • 如何删除Google Chrome中的所有历史记录【一键清除】
  • 关于Android Studio的Gradle各项配置2
  • 神经网络(自己记录)
  • 《大型网站技术架构-核心原理与案例分析》笔记
  • 展销编辑器在未来的发展前景​
  • 硬盘损坏数据恢复后对python程序的影响
  • Ant(Ubuntu 18.04.6 LTS)安装笔记
  • 20250427在ubuntu16.04.7系统上编译NanoPi NEO开发板的FriendlyCore系统解决问题mkimage not found
  • django filter 日期大于当前日期的
  • 4月27号
  • 数据结构强化篇
  • 游戏引擎学习第247天:简化DEBUG_VALUE
  • 从零开始了解数据采集(二十一)——电子制造行业趋势分析案例