如何在 OpenCV Python 中使用图像金字塔混合图像?
opencvpythonserver side programmingprogramming
我们可以使用高斯和拉普拉斯图像金字塔混合图像。高斯金字塔是一种图像金字塔。为了创建高斯金字塔,OpenCV 为我们提供了两个函数cv2.pyrDown()和cv2.pyrUp()。我们可以从高斯金字塔中形成拉普拉斯金字塔。在拉普拉斯金字塔中,图像看起来仅像边缘图像。拉普拉斯金字塔中的层级由高斯金字塔中的该层级与高斯金字塔中其上层的扩展版本之间的差异形成。
步骤
要使用图像金字塔混合图像,我们可以按照以下步骤操作 -
导入所需的库 OpenCV 和 NumPy。确保您已经安装了它们。
使用 cv2.imread() 方法读取两个输入图像 A 和 B。指定完整图像路径。将图像大小调整为 (512,512)。
为输入图像 A 和 B 生成高斯金字塔。
使用高斯金字塔,为输入图像 A 和 B 生成拉普拉斯金字塔。
在拉普拉斯金字塔的每一层中添加第一幅图像的左半部分和第二幅图像的右半部分。
混合并重建图像。显示混合图像
让我们看一些示例以便更清楚地理解。
输入图像
我们将在下面的示例中使用以下图像作为输入文件。
示例
在此示例中,我们使用图像金字塔混合两个输入图像。
import cv2 import numpy as np,sys A = cv2.imread('car.jpg') B = cv2.imread('blue-car.jpg') A = cv2.resize(A, (512, 512)) B = cv2.resize(B, (512, 512)) # generate Gaussian pyramid for A G = A.copy() gpA = [G] for i in range(6): G = cv2.pyrDown(G) gpA.append(G) # generate Gaussian pyramid for B G = B.copy() gpB = [G] for i in range(6): G = cv2.pyrDown(G) gpB.append(G) # generate Laplacian Pyramid for A lpA = [gpA[5]] for i in range(5,0,-1): GE = cv2.pyrUp(gpA[i]) L = cv2.subtract(gpA[i-1],GE) lpA.append(L) # generate Laplacian Pyramid for B lpB = [gpB[5]] for i in range(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 in zip(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 in range(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.imshow('Pyramid_blending.jpg',ls_) cv2.waitKey(0) cv2.imshow('Direct_blending.jpg',real) cv2.waitKey(0) cv2.destroyAllWindows()
输出
上述程序执行后将产生以下两个输出窗口 -
第一个窗口显示使用图像金字塔的图像混合,第二个窗口显示直接图像混合。注意上面两幅图像之间的区别。