python 高斯金字塔_python+opencv图像金字塔融合 (超详细讲解原理及代码讲解)

本篇内容参考《Opencv官方教程中文版(Python)》的内容进行讲解和分析,其下载网址为 http://download.csdn.net/download/dengxf01/9692646

由于书中代码所使用版本问题,所以,不少读者将其代码复制后,运行时出现错误,在这里我将以Python3.6.1,Opencv 3.2版本进行代码展示和讲解。

图像金字塔主要涉及两个函数:cv2.pyrUp()(图像尺寸变小),cv2.pyrDown()(图像尺寸变大,但会模糊)

图像金字塔有两类类型:高斯金字塔和拉普拉斯金字塔。

高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。这样操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所谓的5个元素是指:前后左右+自身。下图为高斯金字塔cv2.pyrUp() 的效果

高斯金字塔将小图变大图用,cv2.pyrDown(),但是图像会模糊,如下图,从小图变大后的图像

对于拉普拉斯金字塔,其计算公式与高斯金字塔相关,具体为

Li=Gi-pyrUp(Gi+1), 其中i和i+1为下角标

拉普拉斯金字塔的图像效果为:

图像融合的两个重要作用为:

1.实现两个图像的无缝连接,下面用苹果和橘子的例子说明

2.图像压缩,从苹果和橘子的例子中,读者可以体会如何利用小图像(被高斯金字塔变换后的图像)和几层拉普拉斯金字塔表示大图像信息(拉普拉斯金字塔即使图像很大,由于大部分为黑色,可认为是0,因此压缩后数量很小)

苹果和橘子的例子的原始图像和融合后效果如图所示:

对于读者,实施苹果和橘子的数据准备阶段:

苹果和橘子的图片,但是要注意!!!!!!!!!!!由于程序采用六层金字塔,一次其图片像素的行数和列数要能够被(2X2X2X2X2X2)整除哦,否则计算过程中像素矩阵对不上就麻烦了。

程序:

importcv2

importnumpy as np

A = cv2.imread('apple.jpg')

B = cv2.imread('orange.jpg')

# generate Gaussian pyramid for A

G = A.copy()

gpA = [G]

foriinnp.arange(6):#将苹果进行高斯金字塔处理,总共六级处理

G = cv2.pyrDown(G)

gpA.append(G)

# generate Gaussian pyramid for B

G = B.copy()

gpB = [G]

foriinnp.arange(6):# #将橘子进行高斯金字塔处理,总共六级处理

G = cv2.pyrDown(G)

gpB.append(G)

# generate Laplacian Pyramid for A

lpA = [gpA[5]]

foriinnp.arange(5,0,-1):#将苹果进行拉普拉斯金字塔处理,总共5级处理

GE = cv2.pyrUp(gpA[i])

L = cv2.subtract(gpA[i-1],GE)

lpA.append(L)

# generate Laplacian Pyramid for B

lpB = [gpB[5]]

foriinnp.arange(5,0,-1):#将橘子进行拉普拉斯金字塔处理,总共5级处理

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

#numpy.hstack(tup)

#Take a sequence of arrays and stack them horizontally

#to make a single array.

LS = []

forla,lbinzip(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]#这里LS[0]为高斯金字塔的最小图片

foriinxrange(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)

对于读者进行程序调试时,可通过cv2.imshow()和cv2.waitKey()函数进行查看各个过程的输出。

完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值