OpenCV-Python快速入门(八):图像金字塔

本文介绍了OpenCV-Python中图像金字塔的概念,包括高斯金字塔和拉普拉斯金字塔的实现。通过`cv2.pyrDown()`和`cv2.pyrUp()`函数展示了如何进行图像的下采样和上采样,并探讨了拉普拉斯金字塔在恢复高分辨率图像中的应用。此外,还提供了相关代码示例和实验环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 本文是个人快速入门OpenCV-Python的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入
    OpenCV-Python快速入门
    专栏或我的个人主页查看

前提条件

实验环境

  • Python 3.x (面向对象的高级语言)
  • OpenCV 4.0(python第三方库)pip3 install opencv-python

图像金字塔

  • 图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。
  • 图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。
    在这里插入图片描述

高斯金字塔

  • 高斯金字塔是通过不断地使用高斯金字塔滤波、采样所产生的,图像金字塔操作中的向下采样流程,如下图所示。
    图像金字塔操作中的向下采样流程
  • 注:需要了解高斯滤波的,可查阅OpenCV-Python快速入门(六):图像平滑
cv2.pyrDown()实现图像金字塔
import cv2
import numpy as np

img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
参数说明:
    dst 为目标图像。
    src 为原始图像。
    dstsize 为目标图像的大小。
    borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
    且这里仅支持BORDER_DEFAULT。
'''
r1=cv2.pyrDown(img1_resize)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
cv2.imshow("origin",img1_resize)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

cv2.pyrUp()实现图像金字塔
import cv2
import numpy as np

img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(50,50))
'''
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
    dst 为目标图像。
    src 为原始图像。
    dstsize 为目标图像的大小。
    borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
    且这里仅支持BORDER_DEFAULT。
'''
r1=cv2.pyrUp(img1_resize)
r2=cv2.pyrUp(r1)
r3=cv2.pyrUp(r2)
cv2.imshow("origin",img1_resize)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

拉普拉斯金字塔

  • 一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。
  • 向上采样并不是向下采样的逆运算。这是很明显的,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行和偶数列,不可避免地要丢失一些信息。
  • 为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
  • 拉普拉斯金字塔的定义为 L i = G i − p y r U p ( G i + 1 ) L_i = G_i - pyrUp(G_i + 1) Li=GipyrUp(Gi+1)其中, L i L_i Li 表示拉普拉斯金字塔中的第 i i i层。 G i G_i Gi表示高斯金字塔中的第 i i i层。
    在这里插入图片描述
cv2.pyrDown()和 cv2.pyrUp()构造拉普拉斯金字塔
import cv2
import numpy as np

img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
    dst 为目标图像。
    src 为原始图像。
    dstsize 为目标图像的大小。
    borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
    且这里仅支持BORDER_DEFAULT。
'''
G0=img1_resize
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)
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

应用:恢复高分辨率图像
import cv2
import numpy as np

img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
    dst 为目标图像。
    src 为原始图像。
    dstsize 为目标图像的大小。
    borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
    且这里仅支持BORDER_DEFAULT。
'''
G0=img1_resize
G1=cv2.pyrDown(G0)
L0=G0-cv2.pyrUp(G1)
RO=L0+cv2.pyrUp(G1) # 通过拉普拉斯图像复原的原始图像
print("GO.shape=",G0.shape)
print("RO.shape=",RO.shape)
res=RO-G0 # 将 G0 和 RO 做减法运算
# 计算 res 的绝对值,避免求和时负负为正,3+(-3)=0
res=abs(res)
# 计算 res 所有元素的和
print("原始图像 GO 与恢复图像 RO 之差的绝对值和:",np.sum(res))
cv2.imshow("Origin_img_G0",G0)
cv2.imshow("Laplacian_img_L0",L0)
cv2.imshow("Restore_img_RO",RO)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

参考文献

[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FriendshipT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值