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()
相关推荐
Qiuner5 分钟前
【源力觉醒 创作者计划】开源、易用、强中文:文心一言4.5或是 普通人/非AI程序员 的第一款中文AI?
人工智能·百度·开源·文心一言·gitcode
未来之窗软件服务17 分钟前
chrome webdrive异常处理-session not created falled opening key——仙盟创梦IDE
前端·人工智能·chrome·仙盟创梦ide·东方仙盟·数据调式
赶紧去巡山25 分钟前
pyhton基础【23】面向对象进阶四
python
AI街潜水的八角34 分钟前
深度学习图像分类数据集—蘑菇识别分类
人工智能·深度学习·分类
旷世奇才李先生1 小时前
PyCharm 安装使用教程
ide·python·pycharm
飞睿科技1 小时前
乐鑫代理商飞睿科技,2025年AI智能语音助手市场发展趋势与乐鑫芯片解决方案分析
人工智能
许泽宇的技术分享1 小时前
从新闻到知识图谱:用大模型和知识工程“八步成诗”打造科技并购大脑
人工智能·科技·知识图谱
这里有鱼汤1 小时前
“对象”?对象你个头!——Python世界观彻底崩塌的一天
后端·python
坤坤爱学习2.01 小时前
求医十年,病因不明,ChatGPT:你看起来有基因突变
人工智能·ai·chatgpt·程序员·大模型·ai编程·大模型学
尘浮7281 小时前
60天python训练计划----day59
开发语言·python