您的位置:首页 > 编程语言 > Python开发

python opencv入门 图像金字塔(16)

2017-07-31 10:51 260 查看
内容来自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)




步骤:

读入两张图片

构建两张图片的6层高斯金字塔

根据高斯金字塔计算拉普拉斯金字塔

在拉普拉斯金字塔每一层进行融合

融合后重建图像
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: