# 一个金字塔的应用是图像混合,比如拼接中,你可能会需要把两个图像堆到一起,不过可能会因为图像不连续而不好看,# 在这种情况下,用金字塔进行图像混合可以让图片无缝混合# 拼接图像import cv2
import numpy as np, sys
A = cv2.imread('smallpig.jpg')
B = cv2.imread('zaodian_smallpig.jpg')print(B.shape)print(A.shape)
A = cv2.resize(A,(768,1152), interpolation=cv2.INTER_CUBIC)#图像大小转换 一次其图片像素的行数和列数要能够被(2X2X2X2X2X2)整除
B = cv2.resize(B ,(768,1152), interpolation=cv2.INTER_CUBIC)#图像大小转换 保证其行列都是2的n次方的倍数# generate Gaussian pyramid for A
G = A.copy()
gpA =[G]for i inrange(6):
G = cv2.pyrDown(G)
gpA.append(G)# generate Gaussian pyramid for B
G = B.copy()
gpB =[G]for i inrange(6):
G = cv2.pyrDown(G)
gpB.append(G)# generate Laplacian Pyramid for A
lpA =[gpA[5]]for i inrange(5,0,-1):
GE = cv2.pyrUp(gpA[i])print(GE.shape)print(gpA[i-1].shape)
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)# generate Laplacian Pyramid for B
lpB =[gpB[5]]for i inrange(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)# Now add left and right halves of images in each level
LS =[]for la, lb inzip(lpA,lpB):
rows, cols, dpt=la.shape
ls = np.hstack((la[:,0:cols//2],lb[:,cols//2:]))
LS.append(ls)# now reconstruct
ls_ = LS[0]for i inrange(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_,LS[i])# image with direct connecting each half
real = np.hstack((A[:,:cols//2],B[:,cols//2:]))
cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)