如何在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()
输出
上述程序执行后,将产生以下两个输出窗口 –
第一个窗口显示了使用图像金字塔进行图像混合,第二个窗口显示了直接图像混合。请注意上面两个图像之间的差异。