内容来自OpenCV-Python Tutorials 自己翻译整理

目标:
学习图像金字塔
使用图像金字塔创造新水果“橘果”(橘子+苹果)
学习函数 cv2.pyrUp(), cv2.pyrDown()

原理:
正常情况下,我们经常处理固定分辨率的图像。有时也会处理不同分辨率的相同图像。例如在图像中找某个东西,比如找人脸,我们不清楚图像中人脸的大小。这时我们需要创建一堆不同分辨率图像,去寻找物体。这些不同分辨率的图像就是图像金字塔(小分辨率的图像在顶部,大的在底部)。

图像金字塔有两种:高斯金字塔和拉普拉斯金字塔
高斯金字塔当中,(高等级)低分辨率的图像由(低等级)高分辨率的图像去除连续的行和列得到。顶部图像的每个像素值等于下面图像的对应像素的5*5区域的高斯加权平均值。这样操作以后,M×N的图像就变成了M/2×N/2的图像了,面积变为原理的四分之一。继续这样的操作就会得到一个图像分辨率递减的金字塔,使用函数cv2.pyrDown() 和 cv2.pyrUp()构建。

cv2.pyrDown()函数构建从高分辨率到低分辨率的金字塔。
cv2.pyrUp() 构建从低分辨率到高分辨率的金字塔(尺寸变大,分辨率不变)

使用cv2.pyrDown函数图像分辨率会降低,信息会被丢失

拉普拉斯金字塔像边界图,很多像素值为0。经常被用在图像压缩中

使用金字塔进行图像混合

图像金字塔的一个应用就是图像混合,由于两个不同图像像素的不连续性,混合后的图像效果很差。这时可以使用图像金字塔。

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 xrange(6):
    G = cv2.pyrDown(G)
    gpA.append(G)

# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpB.append(G)

# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(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 xrange(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 xrange(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)

Python输出金字塔星号图案 python 输出金字塔_图像金字塔

步骤:
读入两张图片
构建两张图片的6层高斯金字塔
根据高斯金字塔计算拉普拉斯金字塔
在拉普拉斯金字塔每一层进行融合
融合后重建图像