当前位置: 首页 > 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)结合使用。读者可以尝试调整金字塔层数,或结合边缘检测算法探索更多应用场景

相关文章:

  • rt-linux下的cgroup cpu的死锁bug
  • 解决SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption faile的问题
  • 【AI模型学习】GPT——从v1到v3
  • 微软GraphRAG的安装和在RAG中的使用体会
  • 安卓7.0以上抓包配置--Charles
  • 技能点总结
  • Android四大核心组件
  • 数据结构——二叉树和堆(万字,最详细)
  • Day 12
  • 【Vue】单元测试(Jest/Vue Test Utils)
  • React自定义Hook之useMutilpleRef
  • React19源码系列之 root.render过程
  • Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)
  • 14、服务端组件:未来魔法预览——React 19 RSC实践
  • 权力结构下的人才价值重构:从 “工具论” 到 “存在论” 的转变​
  • 详解React Fiber架构中,reconcile阶段的具体工作流程
  • 【项目篇之消息序列化】仿照RabbitMQ模拟实现消息队列
  • PostgreSQL psql 命令和常用的 SQL 语句整理
  • WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
  • 哈希封装unordered_map和unordered_set的模拟实现
  • 杭州打造商业航天全产业链,请看《浪尖周报》第22期
  • 美国政府将暂时恢复部分受影响留学生的合法身份,并将制订新标准
  • 同款瑞幸咖啡竟差了6元,开了会员仍比别人贵!客服回应
  • 单位被裁定补缴12年社保,滞纳金该谁出?
  • 美联合健康集团高管枪杀案嫌疑人对谋杀指控不认罪
  • 获公示拟任省辖市委副书记的胡军,已赴南阳履新