python+opencv图像⾦字塔融合(超详细讲解原理及代码讲解)本篇内容参考《Opencv官⽅教程中⽂版(Python)》的内容进⾏讲解和分析,其下载⽹址为
拓跋氏
download.csdn/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)整除哦,否则计算过程中像素矩阵对不上就⿇烦了。
程序:
[python] view plain copy
法定节假日工资
1. import cv2
2. import numpy as np
3. A = cv2.imread('apple.jpg')
4. B = cv2.imread('orange.jpg')
5. # generate Gaussian pyramid for A
6. G = A.copy()
7. gpA = [G]
8. for i in np.arange(6): #将苹果进⾏⾼斯⾦字塔处理,总共六级处理
9. G = cv2.pyrDown(G)
10. gpA.append(G)
11. # generate Gaussian pyramid for B
12. G = B.copy()
13. gpB = [G]
14. for i in np.arange(6): # #将橘⼦进⾏⾼斯⾦字塔处理,总共六级处理
15. G = cv2.pyrDown(G)
16. gpB.append(G)
17. # generate Laplacian Pyramid for A
18. lpA = [gpA[5]]
19. for i in np.arange(5,0,-1): #将苹果进⾏拉普拉斯⾦字塔处理,总共5级处理
20. GE = cv2.pyrUp(gpA[i])
21. L = cv2.subtract(gpA[i-1],GE)
22. lpA.append(L)
23. # generate Laplacian Pyramid for B
24. lpB = [gpB[5]]
25. for i in np.arange(5,0,-1): #将橘⼦进⾏拉普拉斯⾦字塔处理,总共5级处理
26. GE = cv2.pyrUp(gpB[i])
27. L = cv2.subtract(gpB[i-1],GE)
牛奶之歌
28. lpB.append(L)
29. # Now add left and right halves of images in each level
30. #numpy.hstack(tup)
穷人读后感31. #Take a quence of arrays and stack them horizontally
32. #to make a single array.
33. LS = []
34. for la,lb in zip(lpA,lpB):
35. rows,cols,dpt = la.shape
36. ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:])) #将两个图像的矩阵的左半部分和右半部分
拼接到⼀起
37. LS.append(ls)
辩论赛四辩总结陈词格式38. # now reconstruct
39. ls_ = LS[0] #这⾥LS[0]为⾼斯⾦字塔的最⼩图⽚
40. for i in xrange(1,6): #第⼀次循环的图像为⾼斯⾦字塔的最⼩图⽚,依次通过
拉普拉斯⾦字塔恢复到⼤图像
41. ls_ = cv2.pyrUp(ls_)
42. ls_ = cv2.add(ls_, LS[i]) #采⽤⾦字塔拼接⽅法的图像
43. # image with direct connecting each half
44. real = np.hstack((A[:,:cols/2],B[:,cols/2:])) #直接的拼接
45. cv2.imwrite('Pyramid_blending2.jpg',ls_)
46. cv2.imwrite('Direct_blending.jpg',real)
对于读者进⾏程序调试时,可通过cv2.imshow()和cv2.waitKey()函数进⾏查看各个过程的输出。完!