20 图像金字塔
高斯金字塔
拉普拉斯金字塔
所用函数:
def pyrDown(src, #输入图像
dst=None, #输出图像
dstsize=None, #输出图像的大小
borderType=None)#图像边界的处理方式
def pyrUp(src,
dst=None,
dstsize=None,
borderType=None)
1 原理
示例代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2016/11/21 14:01
# @Author : Retacn
# @Site :
图像金字塔
# @File : imagePyr.py
# @Software: PyCharm
import
cv2
import
numpy
as
np,sys
from
matplotlib
import
pyplot
as
plt
img=cv2.imread('../test.jpg',0)
lower_reso=cv2.pyrDown(img)
higher_reso=cv2.pyrUp(img)
plt.subplot(131),plt.imshow(img,'gray')
plt.title('Original')
#,plt.xticks([]),plt.yticks([])
plt.subplot(132),plt.imshow(lower_reso,'gray')
plt.title('Lower_reso')
#,plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(higher_reso,'gray')
plt.title('Higher_reso')
#,plt.xticks([]),plt.yticks([])
plt.show()
2 使用金字塔进行图像融合
示例代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2016/11/21 14:44
# @Author : Retacn
# @Site :
图像融合
# @File : ImageFusion.py
# @Software: PyCharm
import
cv2
import
numpy
as
np,sys
from
matplotlib
import
pyplot
as
plt
"""
使得img1的大小与img2相同
"""
def
sameSize(img1, img2):
rows, cols, dpt = img2.shape
dst = img1[:rows,:cols]
return
dst
#读入图像
apple=cv2.imread('../apple.jpg')
orange=cv2.imread('../orange.jpg')
#为图像苹果创建一个高斯金字塔
temp_c=apple.copy()
apple_gp=[temp_c]
for
i
in
range(6):
temp_c=cv2.pyrDown(temp_c)
apple_gp.append(temp_c)
#为图像橙子创建一个高斯金字塔
temp_c=orange.copy()
orange_gp=[temp_c]
for
i
in
range(6):
temp_c=cv2.pyrDown(temp_c)
orange_gp.append(temp_c)
#为图像苹果创建一个拉普拉斯金字塔
apple_lp=[apple_gp[5]]
for
i
in
range(5,0,-1):
GE=cv2.pyrUp(apple_gp[i])
L=cv2.subtract(apple_gp[i-1],sameSize(GE,apple_gp[i-1]))
apple_lp.append(L)
#为图像橙子创建一个拉普拉斯金字塔
orange_lp=[orange_gp[5]]
for
i
in
range(5,0,-1):
GE=cv2.pyrUp(orange_gp[i])
L=cv2.subtract(orange_gp[i-1],sameSize(GE,orange_gp[i-1]))
orange_lp.append(L)
#1/2 Laplace金字塔进行拼接
LS=[]
for
apple_l,orange_l
in
zip(apple_lp,orange_lp):
rows,cols,dpt=apple_l.shape
ls = np.hstack((apple_l[:,0:cols/2],
orange_l[:,cols/2:]))
LS.append(ls)
#对拼接后的laplace金字塔重建,取得融合后的图像
ls_=LS[0]
for
i
in
range(1,6):
ls_=cv2.pyrUp(ls_)
ls_=cv2.add(sameSize(ls_,LS[i]),LS[i])
real=np.hstack((apple[:,:cols/2],orange[:,cols/2:]))
#保存图像
#cv2.imwrite('Pyramid_blending2.jpg',ls)
#cv2.imwrite('Direct_blending.jpg',real)
#显示图像
plt.subplot(121),plt.imshow(ls_,'gray')
plt.title('ls_')
plt.subplot(122),plt.imshow(real,'gray')
plt.title('real')
plt.show()