OpenCV进阶操作:图像金字塔

文章目录


前言

在计算机视觉领域,图像金字塔是一种重要的多尺度表示方法。通过构建图像金字塔,我们可以高效地处理不同分辨率下的图像特征。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()函数实现向下采样

python 复制代码
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 复制代码
```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、向下采样再向上采样

  • 对下采样后图像进行上采样,图像变模糊,无法复原
  • 对上采样后图像进行下采样,图像变模糊,无法复原
python 复制代码
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、拉普拉斯金字塔

python 复制代码
L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_up

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

总结

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

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

  • 提取多尺度特征

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

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

相关推荐
量子位7 分钟前
图像编辑开源新 SOTA,来自多模态卷王阶跃!大模型行业正步入「多模态时间」
人工智能·llm
量子位9 分钟前
数学家们仍在追赶天才拉马努金
人工智能·数学
是瑶瑶子啦12 分钟前
【深度学习】多头注意力机制的实现|pytorch
人工智能·pytorch·深度学习
小和尚同志17 分钟前
热门 AI 编辑器(Cursor、v0、Manus、Windsurf 等)及工具的系统提示词
人工智能·aigc
量子位24 分钟前
不用等R2了!第三方给新版DeepSeek V3添加深度思考,推理101秒破解7米甘蔗过2米门
人工智能·deepseek
用户2745339106834 分钟前
MCP 生命周期
人工智能
何仙鸟40 分钟前
卷积神经网络实战(1)
人工智能·神经网络·cnn
电鱼智能的电小鱼1 小时前
EFISH-SBC-RK3588 —— 厘米级定位 × 旗舰算力 × 工业级可靠‌
linux·人工智能·嵌入式硬件·边缘计算
FIT2CLOUD飞致云1 小时前
干货分享|MaxKB智能问数方案及步骤详解
人工智能·开源