目录:
- 1.图像金字塔
- 1)高斯金字塔
- 2)拉普拉斯金字塔
- 使用图像金字塔创建一个新的水果,“Orapple”
一、图像金字塔
通常,我们曾经使用恒定大小的图像。 但在某些情况下,我们需要使用不同分辨率的(相同)图像。 例如,在搜索图像中的某些内容时,如脸部,我们不确定该对象在所述图像中的大小。 在这种情况下,我们需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。 这些具有不同分辨率的图像被称为图像金字塔(因为当它们保持在堆叠中,底部具有最高分辨率图像而顶部具有最低分辨率图像时,它看起来像金字塔)。
图像金字塔有两种:高斯金字塔、拉普拉斯金字塔。
1)高斯金字塔
高斯金字塔的最底层就是原图像,如果我们利用一个高斯核,对图像进行卷积,然后删除所有的偶数行和偶数列,就得到了一个尺寸只有原来四分之一的图像,这个图像就是高斯金字塔的上一层。
如果重复这个卷积核删除偶数行列的操作,直到图像的像素为1*1,那么就得到了完整的金字塔。

OpenCV 中使用 cv.pyrDown() 和 cv.pyrUp() 函数找到高斯金字塔。
示例:
# 1.高斯金字塔
import cv2
img = cv2.imread("image/13.jpg")
# Gaussian Pyramid
gp = []
img_copy = img.copy()
gp.append(img_copy)
for i in range(1, 4):
img_copy = cv2.pyrDown(img_copy) # 下采样
# img_g = cv2.pyrUp(img_copy) # 上采样
gp.append(img_copy)
# 展示图片
for i in range(len(gp)):
cv2.imshow(f"img{i}", gp[i])
cv2.waitKey(0)
cv2.destroyWindow()
结果如下图:

2)拉普拉斯金字塔
拉普拉斯金字塔由高斯金字塔形成,没有专属功能。 拉普拉斯金字塔图像仅与边缘图像相似。 它的大部分元素都是零。 它们用于图像压缩。 拉普拉斯金字塔中的一个层次由高斯金字塔中的该层次与高斯金字塔中的上层的扩展版本之间的差异形成。
示例:
# 2.拉普拉斯金字塔
import cv2
img = cv2.imread("image/13.jpg")
# 1)先获取高斯金字塔
gp = []
img_copy = img.copy()
gp.append(img_copy)
for i in range(1, 4):
img_copy = cv2.pyrDown(img_copy)
gp.append(img_copy)
# 2)遍历高斯金字塔,得到拉普拉斯金字塔
lp = [] # Laplacian Pyramid
for i in range(len(gp)-1, 0, -1):
GE = cv2.pyrUp(gp[i])
L = cv2.subtract(gp[i - 1], GE)
lp.append(L)
# 展示图片
for i in range(len(lp)):
cv2.imshow(f"img{i}", lp[i])
cv2.waitKey(0)
cv2.destroyWindow()
结果如下图:

二、使用图像金字塔创建一个新的水果,“Orapple”
# 3.使用图像金字塔创建一个新的水果,'Orapple'
import cv2
import numpy
A = cv2.imread("image/21.jpg")
B = cv2.imread("image/22.jpg")
print(A.shape) # (256, 256, 3)
print(B.shape) # (256, 256, 3)
# 1)高斯金字塔
GA = A.copy()
gpA = [GA]
for i in range(6):
GA = cv2.pyrDown(GA)
gpA.append(GA)
GB = B.copy()
gpB = [GB]
for i in range(6):
GB = cv2.pyrDown(GB)
gpB.append(GB)
# 2)拉普拉斯金字塔
lpA = [gpA[6]]
for i in range(6, 0, -1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i - 1], GE)
lpA.append(L)
lpB = [gpB[6]]
for i in range(6, 0, -1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i - 1], GE)
lpB.append(L)
# 3)拼接苹果和橘子
LS = []
for la, lb in zip(lpA, lpB):
rows, cols, channels = la.shape
ls = numpy.hstack((la[:, :cols // 2], lb[:, cols // 2:]))
LS.append(ls)
ls_ = LS[0]
for i in range(1, len(LS)):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])
cv2.imshow(f"xxx{i}", ls_)
# 直接合成的图片
rows, cols, channels = A.shape
real = numpy.hstack((A[:, :cols // 2], B[:, cols // 2:]))
cv2.imshow("real", real)
cv2.waitKey(0)
cv2.destroyWindow()

网友评论