在一些情况下,我们需要使用不同分辨率的图像。比如,我们在图像中搜索某一样东西时,比如脸部,我们不确定它的尺寸,所以需要创建不同分辨率的脸的图像。这些具有不同分辨率的图像被称为图像金字塔(因为他们被存在一个栈中,顶部分辨率最低,底部分辨率最高,所以是金字塔)
又两种类型的金字塔,一个是高斯金字塔,一个是拉普拉斯金字塔
高斯金字塔
img = cv.imread('messi5.jpg')
lower_reso = cv.pyrDown(higher_reso)
图像拼合
import cv2 as cv
import numpy as np,sys
A = cv.imread('apple.jpg')
B = cv.imread('orange.jpg')
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv.pyrDown(G)
gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
G = cv.pyrDown(G)
gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
GE = cv.pyrUp(gpA[i])
L = cv.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
GE = cv.pyrUp(gpB[i])
L = cv.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 xrange(1,6):
ls_ = cv.pyrUp(ls_)
ls_ = cv.add(ls_, LS[i])
# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv.imwrite('Pyramid_blending2.jpg',ls_)
cv.imwrite('Direct_blending.jpg',real)
参考文献:
https://blog.youkuaiyun.com/qq_41905045/article/details/81351662
https://docs.opencv.org/3.4.3/dc/dff/tutorial_py_pyramids.html