Laplacian图像金字塔的实现方法是:某层图像减去下一级上采样后的图像。
L
i
=
S
i
−
P
y
u
p
(
S
i
+
1
)
L_i=S_i-Pyup(S_{i+1})
Li=Si−Pyup(Si+1)
这里以图像融合例子对图像金字塔进行学习。
两张图片分别记为图片 A 0 A_0 A0、 B 0 B_0 B0。
1.对 A 0 A_0 A0下采样,依次得到不同大小的下采样图片 A 1 A_1 A1, A 2 A_2 A2,……, A n A_n An。
2.有1中的图片,获得图片 A A A的Laplacian金字塔图片 L A 0 LA_0 LA0, L A 1 LA_1 LA1,……, L A n − 1 LA_{n-1} LAn−1,另外图片 L A n LA_n LAn即为 A n A_n An。
3.对图片 B B B,如上操作,获得 L B 0 LB_0 LB0, L B 1 LB_1 LB1,……, L B n LB_n LBn
4.依次取 L A i LA_i LAi的左半部分和 L B i LB_i LBi的右半部分,进行组合,得到 L 0 L_0 L0,……, L n L_n Ln。
5.对 L L L图片,从后往前重建图像,即取 L n L_n Ln,上采样后加上 L n − 1 L_{n-1} Ln−1,循环往前,最终完成图像重建。
具体代码实现:
初始化:分别获取苹果和橘子的图像保存在AB两个list中,令金字塔层数n为5。
apple=cv.imread('pic/apple.jpg')
orange=cv.imread('pic/orange.jpg')
#apple=np.ones((3,3),dtype=np.uint8)
A=[apple]
B=[orange]
LA,LB,L=[],[],[]
n=5
循环取样获取各层图像
(这里的A[-1]是A列表中的倒数第一个)
for i in range(1,n+1):
A.append(cv.pyrDown(A[-1]))
B.append(cv.pyrDown(B[-1]))
有1中的图片,获得图片 A A A的Laplacian金字塔图片 L A 0 LA_0 LA0, L A 1 LA_1 LA1,……, L A n − 1 LA_{n-1} LAn−1,另外图片 L A n LA_n LAn即为 A n A_n An。对图片 B B B,如上操作,获得 L B 0 LB_0 LB0, L B 1 LB_1 LB1,……, L B n LB_n LBn。
for i in range(n):
LA.append(cv.subtract(A[i],cv.pyrUp(A[i+1])))
LB.append(cv.subtract(B[i],cv.pyrUp(B[i+1])))
LA.append(A[n])
LB.append(B[n])
依次取 L A i LA_i LAi的左半部分和 L B i LB_i LBi的右半部分,进行组合,得到 L 0 L_0 L0,……, L n L_n Ln。对 L L L图片,从后往前重建图像,即取 L n L_n Ln,上采样后加上 L n − 1 L_{n-1} Ln−1,循环往前,最终完成图像重建。
for la,lb in zip(LA,LB):
h,w,c=la.shape
L.append(np.hstack([la[:,:w//2], lb[:,w//2:]]))
B=L[n]
for i in range(n,0,-1):
B=cv.add(cv.pyrUp(B),L[i-1])
cv.imwrite('test/orapple'+str(i)+'.jpg',B)
show(B)
得到如下各层融合图片金字塔: