图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的。
图像金字塔是图像中多尺度表达的一种,主要用于图像分割。
图像金字塔的底部一般是待处理的高分辨率图像,顶部为其低分辨率的图像。从金字塔的底部向顶部移动时,图像的尺寸和分辨率都会随之降低。通常情况下,每向顶部移动一级,图像的宽和高都会减少一半。
高斯金字塔
向下采样:dst = cv2.pyrDown( src[, dstsize[, borderType]] )
向上采样:dst = cv2.pyrUp( src[, dstsize[, borderType]] )
(向下和先上采样会逐渐丢失图像信息,且过程不可逆)
高斯金字塔由底部的最大分辨率图像逐次向下采样得到。
拉普拉斯金字塔
残差金字塔,用来存储下采样后图片与原始图片的差异。
拉普拉斯金字塔在每次向下采样后,将再次向上采样,得到向上采样的 Up(Down(img)) 后,记录 Up(Down(img)) 与 img 的差异信息。
# 先向下采样
img_down0 = cv2.pyrDown(img)
img_down1 = cv2.pyrDown(img_down0)
img_down2 = cv2.pyrDown(img_down1)
# 再向上采样
img_up2 = cv2.pyrUp(img_down2)
img_up1 = cv2.pyrUp(img_up2)
img_up0 = cv2.pyrUp(img_up1)
# 拉普拉斯金字塔
img_down1_up=cv2.pyrUp(img_down1)
# 注意图像尺寸要匹配
h0,w0 = img_down0.shape[:2]
img_down1_up=cv2.resize(img_down1_up,(w0,h0))
L0 = img_down0 - img_down1_up
img_down2_up=cv2.pyrUp(img_down2)
h1,w1 = img_down1.shape[:2]
img_down2_up=cv2.resize(img_down2_up,(w1,h1))
L1 = img_down1 - img_down2_up
# 拉普拉斯变换(恢复原始图像)
img_L0 =L0 + cv2.resize(cv2.pyrUp(img_down1),L0.shape[1::-1])
img_L1 = L1 + cv2.resize(cv2.pyrUp(img_down2),L1.shape[1::-1])
图像融合
图像金字塔可以实现图像融合。
# 高斯金字塔向下采样
def PyramidDown(g,num):
G=g.copy()
gp = [G]
for i in range(num):
G = cv2.pyrDown(G)
gp.append(G)
return gp
# 拉普拉斯金字塔
def LaplacianPyramid(gp,num):
lp = [gp[num]]
for i in range(num,0,-1):
G=cv2.pyrUp(gp[i])
size=gp[i-1].shape[1::-1]
G1=cv2.resize(G,size)
L = gp[i-1]-G1
lp.append(L)
return lp
a = cv2.imread('image/apple.png')
b = cv2.imread('image/orange.png')
# 将红苹果进行高斯金字塔处理,总共6级处理
gpa=PyramidDown(a,6)
# 将青苹果进行高斯金字塔处理,总共6级处理
gpb=PyramidDown(b,6)
# 将红苹果进行拉普拉斯金字塔处理,总共5级处理
lpa=LaplacianPyramid(gpa,5)
# 将青苹果进行拉普拉斯金字塔处理,总共5级处理
lpb=LaplacianPyramid(gpb,5)
# 依次拼接
LS = []
for la,lb in zip(lpa,lpb):
h,w = la.shape[:-1]
# 将参数元组的元素数组按水平方向进行叠加
ls = np.hstack((la[:,0:w//2], lb[:,w//2:]))
LS.append(ls)
# 融合
Ls = LS[0]
for i in range(1,6):
Ls = cv2.pyrUp(Ls)
Ls=cv2.resize(Ls,LS[i].shape[1::-1])
Ls = Ls+LS[i]