【OpenCV-Python】:图像金字塔之高斯金字塔与拉普拉斯金字塔

✨博客主页:王乐予🎈
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法

😺一、前言

以多个分辨率来表示图像的一种有效且概念简单的结构就是图像金字塔

图像金字塔最初用于机器视觉和图像压缩,一个图像金字塔是一系列以金字塔形状排列的、多分辨率逐步降低的图像集合。

金字塔的底部是待处理图像的高分辨率表示,而顶部则包含一个低分辨率近似,当向金字塔的上层移动时,尺寸和分辨率降低。

(美)拉斐尔·C.冈萨雷斯(Rafael C.Gonzalez)著;阮秋琦译.国外电子与通信教材系列 数字图像处理 第3版[M].北京:电子工业出版社.2017.

高斯金字塔与拉普拉斯金字塔是常见的两种图像金字塔。

  • 高斯金字塔:用作下采样;
  • 拉普拉斯金字塔:用来从金字塔低层图像重建上层未採样图像,在数字图像处理中也即是预測残差。能够对图像进行最大程度的还原,配合高斯金字塔一起使用。

😺二、高斯金字塔

🐶2.1 原理

由图可知,高斯金字塔用于下采样操作。首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列),得到上层图像G1(高斯金字塔第1层),再将G1作为输入,重复进行高斯卷积和下采样操作得到G2、G3等,迭代多次最终形成一个金字塔形状的图像结构。
在这里插入图片描述

🐶2.2 程序设计及结果可视化

🦄2.2.1 程序设计

函数:cv2.pyrDown()

import cv2
import numpy as np

original = cv2.imread(r"C:\Users\Lenovo\Desktop\lena1.jpg", 0)     # 灰度图

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

print("original.shape=", G0.shape)
print("G1.shape=", G1.shape)
print("G2.shape=", G2.shape)
print("G3.shape=", G3.shape)

cv2.imwrite(r"C:\Users\Lenovo\Desktop\G0.jpg", G0)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\G1.jpg", G1)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\G2.jpg", G2)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\G3.jpg", G3)

cv2.imshow("original", G0)
cv2.imshow("G1", G1)
cv2.imshow("G2", G2)
cv2.imshow("G3", G3)
cv2.waitKey()

🦄2.2.2 结果可视化

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

😺三、拉普拉斯金字塔

🐶3.1 原理

拉普拉斯金字塔的作用是预测残差,那么什么是图像的残差?

如果高斯金字塔中的一张图 G i G_{i} Gi,经过下采样后得到 D o w n ( G i ) Down(G_{i}) Down(Gi),再经上采样后得到 U p ( D o w n ( G i ) ) Up(Down(G_{i})) Up(Down(Gi)),但是 U p ( D o w n ( G i ) ) Up(Down(G_{i})) Up(Down(Gi)) G i G_{i} Gi是存在差异的,因为下采样过程中丢失的信息无法通过上采样准确恢复,此时我们需要得到 U p ( D o w n ( G i ) ) Up(Down(G_{i})) Up(Down(Gi)) G i G_{i} Gi之间的差异,即残差,这就是拉普拉斯金字塔的核心思想。

下图展示的是拉普拉斯金字塔的过程。
在这里插入图片描述

🐶3.2 拉普拉斯金字塔程序设计及结果可视化

🦄3.2.1 程序设计

函数:cv2.pyrUp()

import cv2
import numpy as np

original = cv2.imread(r"C:\Users\Lenovo\Desktop\lena1.jpg", 0)     # 灰度图

G0 = original
G1 = cv2.pyrDown(original)      # 下采样
G2 = cv2.pyrDown(G1)
G3 = cv2.pyrDown(G2)

U2 = cv2.pyrUp(G3)              # 上采样
U1 = cv2.pyrUp(G2)
U0 = cv2.pyrUp(G1)

L0 = G0 - U0                    # 拉普拉斯金字塔
L1 = G1 - U1
L2 = G2 - U2

print("original.shape=", G0.shape)
print("G1.shape=", G1.shape)
print("G2.shape=", G2.shape)
print("G3.shape=", G3.shape)
print("UO.shape=", U0.shape)
print("U1.shape=", U1.shape)
print("U2.shape=", U2.shape)

cv2.imwrite(r"C:\Users\Lenovo\Desktop\L0.jpg", L0)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\L1.jpg", L1)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\L2.jpg", L2)

cv2.imshow("L0", L0)
cv2.imshow("L1", L1)
cv2.imshow("L2", L2)
cv2.waitKey()

🦄3.2.2 结果可视化

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

🐶3.3 残差融合程序设计及结果可视化

🦄3.3.1 程序设计

import cv2
import numpy as np

original = cv2.imread(r"C:\Users\Lenovo\Desktop\lena1.jpg", 0)     # 灰度图

G0 = original
G1 = cv2.pyrDown(original)      # 下采样
G2 = cv2.pyrDown(G1)
G3 = cv2.pyrDown(G2)

U2 = cv2.pyrUp(G3)      # 上采样
U1 = cv2.pyrUp(G2)
U0 = cv2.pyrUp(G1)

L0 = G0 - U0        # 拉普拉斯金字塔
L1 = G1 - U1
L2 = G2 - U2

RESTORE0 = L0 + U0      # 将残差结果与上采样结果相加
RESTORE1 = L1 + U1
RESTORE2 = L2 + U2

print(G0 == RESTORE0)
print(G1 == RESTORE1)
print(G2 == RESTORE2)

h0 = np.hstack([G0, RESTORE0])
h1 = np.hstack([G1, RESTORE1])
h2 = np.hstack([G2, RESTORE2])

cv2.imwrite(r"C:\Users\Lenovo\Desktop\h0.jpg", h0)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\h1.jpg", h1)
cv2.imwrite(r"C:\Users\Lenovo\Desktop\h2.jpg", h2)

cv2.imshow("h0", h0)
cv2.imshow("h1", h1)
cv2.imshow("h2", h2)
cv2.waitKey()

程序打印结果可以看到经过残差融合后的上采样图像与下采样后的图像是一致的

🦄3.3.2 结果可视化

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王乐予

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

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

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

打赏作者

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

抵扣说明:

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

余额充值