如何在 OpenCV Python 中使用图像金字塔混合图像?


我们可以使用高斯和拉普拉斯图像金字塔混合图像。高斯金字塔是一种图像金字塔。要创建**高斯金字塔**,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()

输出

以上程序执行后,将生成以下两个输出窗口:



第一个窗口显示使用图像金字塔进行图像混合,第二个窗口显示直接图像混合。请注意以上两个图像之间的差异。

更新于: 2022-12-05

1K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告