高斯金字塔
操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一,这被称为 Octave。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。使用函数
cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。
cv2.pyrDown()
cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)
cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
函数的作用:
对图像进行滤波然后进行下采样
参数含义:
- src:表示输入图像
- dst:表示输出图像
- dstsize:表示输出图像的大小
- borderType:表示图像边界的处理方式
cv2.pyrUp()
函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会)
cv2.pyrUp(src, dst=None, dstsize=None, borderType=None)
拉普拉斯金字塔
拉普拉斯金字塔可以由高斯金字塔计算得来,公式如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def sameSize(img1, img2):
rows, cols, dpt = img2.shape
dst = img1[:rows,:cols]
return dst
apple = cv2.imread('image/apple.jpeg')
orange = cv2.imread('image/orange.jpeg')
G = apple.copy()
gp_apple = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gp_apple.append(G)
G = orange.copy()
gp_orange = [G]
for j in xrange(6):
G = cv2.pyrDown(G)
gp_orange.append(G)
lp_apple = [gp_apple[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gp_apple[i])
L = cv2.subtract(gp_apple[i-1], sameSize(GE,gp_apple[i-1]))
lp_apple.append(L)
lp_orange = [gp_orange[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gp_orange[i])
L = cv2.subtract(gp_orange[i-1], sameSize(GE,gp_orange[i-1]))
lp_orange.append(L)
LS = []
for la,lb in zip(lp_apple,lp_orange):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols/2],lb[:,cols/2:]))
LS.append(ls)
ls_reconstruct = LS[0]
for i in xrange(1,6):
ls_reconstruct = cv2.pyrUp(ls_reconstruct)
ls_reconstruct = cv2.add(sameSize(ls_reconstruct,LS[i]), LS[i])
r,c,depth = apple.shape
real = np.hstack((apple[:,0:c/2],orange[:,c/2:]))
plt.subplot(221), plt.imshow(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB))
plt.title("apple"),plt.xticks([]),plt.yticks([])
plt.subplot(222), plt.imshow(cv2.cvtColor(orange,cv2.COLOR_BGR2RGB))
plt.title("orange"),plt.xticks([]),plt.yticks([])
plt.subplot(223), plt.imshow(cv2.cvtColor(real,cv2.COLOR_BGR2RGB))
plt.title("real"),plt.xticks([]),plt.yticks([])
plt.subplot(224), plt.imshow(cv2.cvtColor(ls_reconstruct,cv2.COLOR_BGR2RGB))
plt.title("laplace_pyramid"),plt.xticks([]),plt.yticks([])
plt.show()