目标
在这一章中,
- 我们将学习图像金字塔
- 我们将利用图像金字塔创造一个新的果实,“Orapple”
- 我们将看到这些功能:cv2.pyrUp(), cv2.pyrDown()
理论
通常,我们使用的是大小不变的图像。但在某些情况下,我们需要处理同一图像的不同分辨率的图像。例如,在搜索图像中的某些东西时,比如脸,我们不确定对象在图像中的大小。在这种情况下,我们需要创建一组不同分辨率的图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集被称为图像金字塔(因为它们保存在一个堆栈中,底部有最大的图像,顶部的最小图像看起来像金字塔)。
有两种图像金字塔。1)高斯金字塔和2)拉普拉斯金字塔
高斯金字塔中的较高级别(低分辨率)是通过删除低级别(高分辨率)图像中的连续行和列而形成的。然后,在较高层次上的每个像素是由5像素在底层的高斯权值下形成的。通过这样做,影像化
图像。所以面积减少到原来面积的四分之一,这叫八度音阶。同样的模式仍在继续,因为我们在金字塔的上层(即,分辨率下降)。同样,当面积扩大时,每层面积会增加4倍。
img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)
下面是图像金字塔中的4个层次。
现在你可以沿着图像金字塔cv2.pyrUp()功能。
higher_reso2 = cv2.pyrUp(lower_reso)
记住:higher_reso2 不等于高分辨率因为一旦你降低了分辨率,你就会失去信息。下面的图片是从以前最小的图片中创建的金字塔的3层。将其与原始图像进行比较:
拉普拉斯金字塔是由高斯金字塔形成的,没有排他性的功能。拉普拉斯金字塔图像就像边缘图像。它的大部分元素都是零。它们用于图像压缩。拉普拉斯金字塔的水平是由高斯金字塔的水平与高斯金字塔的上层的扩展版本之间的差异而形成的。拉普拉斯级的三个层次如下(对比调整以增强内容):
基于金字塔的图像混合
金字塔的一个应用是图像混合。例如,在图像拼接中,您需要将两个图像叠加在一起,但由于图像之间的不连续性,它可能看起来不太好。在这种情况下,与金字塔的图像混合为您提供无缝的混合,而不留下大量的数据在图像中。这方面的一个经典例子是两种水果,橘子和苹果的混合。
简单地说,这样做如下:
- 加载苹果和橙色的两个图像
- 查找用于苹果和橙色的高斯金字塔(在本例中,级别数为6)
- 从高斯金字塔中找到它们的拉普拉斯金字塔
- 现在,在拉普拉斯金字塔的每一层加入苹果的左半和橙色的右半。
- 最后,从这个联合图像金字塔,重建原始图像。
下面是完整的代码。(为了简单起见,每一步都是分开进行的,这可能占用更多的内存。如果你愿意的话,你可以优化它)。
import cv2
import numpy as np,sys
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.jpg')
# 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.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)