opencv基础46-图像金字塔02-拉普拉斯金字塔

前面我们介绍了高斯金字塔,高斯金字塔是通过对一幅图像一系列的向下采样所产生的。有时,我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔

前面我们已经介绍过,一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。对此,我们也用程序进行了验证。向上采样并不是向下采样的逆运算。这是很明显的,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行和偶数列,不可避免地要丢失一些信息。

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

拉普拉斯金字塔的定义形式为:

复制代码
Li = Gi - pyrUp(Gi + 1)

式中:

  • Li表示拉普拉斯金字塔中的第 i 层。
  • Gi表示高斯金字塔中的第 i 层。

拉普拉斯金字塔中的第 i 层,等于"高斯金字塔中的第 i 层"与"高斯金字塔中的第 i+1 层的向上采样结果"之差。图 11-11 展示了高斯金字塔和拉普拉斯金字塔的对应关系。

代码示例:使用函数 cv2.pyrDown()和 cv2.pyrUp()构造拉普拉斯金字塔。

复制代码
import cv2
O=cv2.imread("lena.png")
G0=O
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
print("L0.shape=",L0.shape)
print("L1.shape=",L1.shape)
print("L2.shape=",L2.shape)
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.waitKey()
cv2.destroyAllWindows()

程序运行后,会输出如下运行结果:

复制代码
L0.shape= (512, 512, 3)
L1.shape= (256, 256, 3)
L2.shape= (128, 128, 3)

1 中图是通过语句"L0=G0-cv2.pyrUp(G1)",用"原始图像 G0"减去"图像 G1 的向上

采样结果",得到的拉普拉斯金字塔的第 0 层 L0。

右边图是通过语句"L1=G1-cv2.pyrUp(G2)",用"图像 G1"减去"图像 G2 的向上采样

结果",得到的拉普拉斯金字塔的第 1 层 L1。

左边小图是通过语句"L2=G2-cv2.pyrUp(G3)",用"图像 G2"减去"图像 G3 的向上采样

结果",得到的拉普拉斯金字塔的第 2 层 L2。

如何恢复原图?

拉普拉斯金字塔的作用在于,能够恢复高分辨率的图像。图 11-13 演示了如何通过拉普拉斯金字塔恢复高分辨率图像。其中,右图是对左图的简化。

图 11-13 中的各个标记的含义如下:

  1. G0、G1、G2、G3分别是高斯金字塔的第 0 层、第 1 层、第 2 层、第 3 层。
  2. L0、L1、L2分别是拉普拉斯金字塔的第 0 层、第 1 层、第 2 层。
  3. 向下的箭头表示向下采样操作(对应 cv2.pyrDown()函数)。
  4. 向右上方的箭头表示向上采样操作(对应 cv2.pyrUp()函数)。
  5. 加号"+"表示加法操作。
  6. 减号"-"表示减法操作。

在图 11-13 中,描述的操作及关系有:

  1. 向下采样(高斯金字塔的构成)

    G1=cv2.pyrDown(G0)
    G2=cv2.pyrDown(G1)
    G3=cv2.pyrDown(G2)

  2. 拉普拉斯金字塔

    L0=G0-cv2.pyrUp(G1)
    L1=G1-cv2.pyrUp(G2)
    L2=G2-cv2.pyrUp(G3)

  3. 向上采样恢复高分辨率图像

    G0=L0+cv2.pyrUp(G1)
    G1=L1+cv2.pyrUp(G2)
    G2=L2+cv2.pyrUp(G3)

上述关系是通过数学运算推导得到的。例如,已知L0=G0cv2.pyrUp(G1),将表达式右侧的 cv2.pyrUp(G1)移到左侧,就得到了表达式 G0=L0+cv2.pyrUp(G1)。除此之外,G1 和 G2 都可以通过拉普拉斯金字塔的构造表达式得到。在前面已经介绍过了,构造拉普拉斯金字塔的目的就是为了恢复高分辨率的图像。

代码示例:

复制代码
import cv2
import numpy as np
O=cv2.imread("lena.png")
#==============生成高斯金字塔===================
G0=O
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
#============生成拉普拉斯金字塔===================
L0=G0-cv2.pyrUp(G1) #拉普拉斯金字塔第 0 层
L1=G1-cv2.pyrUp(G2) #拉普拉斯金字塔第 1 层
L2=G2-cv2.pyrUp(G3) #拉普拉斯金字塔第 2 层
#=================复原 G0======================
RG0=L0+cv2.pyrUp(G1) #通过拉普拉斯图像复原的原始图像 G0


cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.imshow("RG0",RG0)
cv2.waitKey()
cv2.destroyAllWindows()
相关推荐
鬼手点金5 分钟前
构建有效 Agent 的核心原则
java·人工智能·git·学习·自动化
全栈弄潮儿5 分钟前
Python实战第9期:文件操作
后端·python·编程语言
小星星_ios10 分钟前
从 3Blue1Brown 到 NumPy:手写一个神经网络训练 MNIST
人工智能·python·神经网络
老牛日常随笔11 分钟前
Google把Android测试搬进AI对话:ARTEMIS如何用自然语言操作你的手机
android·人工智能·智能手机
信可维11 分钟前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
Maxwin14 分钟前
Manim 竖屏画布选 9×16 还是 4.5×8?从 font_size 和每单位像素数说起
python·ffmpeg
Csvn14 分钟前
A/B 实验:85% 比 78% 好,居然不算赢?(R03)
人工智能·aigc·agent
随性而行36019 分钟前
企业微信 API 如何实现业务消息自动通知?接口应用场景解析
java·人工智能·后端·微信·机器人·企业微信
昭昭日月明20 分钟前
使用 Ragas 量化 RAG
python·langchain·ai编程
FPGA信号处理22 分钟前
【雷达原理与系统】第四节课:雷达波形与脉冲压缩
人工智能·计算机视觉·目标跟踪