我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔。
一幅图像在经过向下采样后,再对其向上采样,是无法恢复为原始状态的。
为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
拉普拉斯金字塔的定义形式为:
$$ L_{i} = G_{i}-pyrUp(G_{i+1}) $$
拉普拉斯金字塔的第i层,等于“高斯金字塔的第i层”与“高斯金字塔中的第i+1层的向上采样结果”之差。
$$ G_{0}、G_{1}、G_{2}、G_{3}分别是高斯金字塔的第0层、第1层、第2层、第3层 $$
$$ L_{0}、L_{1}、L_{2}分别是拉普拉斯金字塔的第0层、第1层、第2层 $$
高斯金字塔和拉普拉斯金字塔的关系:
向下取样(高斯金字塔的构成)
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)
向上采样恢复高分辨率图像
G0 = L0 + cv2.pyrUp(G1)
G1 = L1 + cv2.pyrUp(G2)
G2 = L2 + cv2.pyrUp(G3)
例:编写程序,使用拉普拉斯金字塔及高斯金字塔恢复高斯金字塔内的多层图像。
import cv2 import numpy as np img = cv2.imread('mile.jpg') # ------生成高斯金字塔--------- G0 = img 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) #通过拉普拉斯图像进行复原 # -----将复原的RG0和原来的G0进行比较 print('G0.shape = ',G0.shape) print('RG0.shape = ',RG0.shape) result = RG0 - G0 #将RG0与G0相减 #计算result的绝对值,再求和 result = abs(result) print('result求值为:',np.sum(result)) # -----复原G1和G2类似,此处省略-----
运行结果:
G0.shape = (404, 376, 3)
RG0.shape = (404, 376, 3)
result求值为: 0