✨博客主页:王乐予🎈
✨年轻人要: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 结果可视化