Python+OpenCV学习(14)---Laplace金字塔进行图像融合

来源:互联网 发布:最新网页制作软件 编辑:程序博客网 时间:2024/05/06 04:23

利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。

下面是利用python语言结合OpenCV进行图像融合的代码:

# -*- coding:utf-8 -*-__author__ = 'Microcosm'import cv2import numpy as npfrom matplotlib import pyplot as pltdef sameSize(img1, img2):    """    使得img1的大小与img2相同    """    rows, cols, dpt = img2.shape    dst = img1[:rows,:cols]    return dstapple = cv2.imread("E:\python\Python Project\opencv_showimage\images\\apple.jpg")orange = cv2.imread("E:\python\Python Project\opencv_showimage\images\\orange.jpg")# 对apple进行6层高斯降采样G = apple.copy()gp_apple = [G]for i in xrange(6):    G = cv2.pyrDown(G)    gp_apple.append(G)# 对orange进行6层高斯降采样G = orange.copy()gp_orange = [G]for j in xrange(6):    G = cv2.pyrDown(G)    gp_orange.append(G)# 求apple的Laplace金字塔lp_apple = [gp_apple[5]]for i in xrange(5,0,-1):    GE = cv2.pyrUp(gp_apple[i])    L = cv2.subtract(gp_apple[i-1], sameSize(GE,gp_apple[i-1]))    lp_apple.append(L)# 求orange的Laplace金字塔lp_orange = [gp_orange[5]]for i in xrange(5,0,-1):    GE = cv2.pyrUp(gp_orange[i])    L = cv2.subtract(gp_orange[i-1], sameSize(GE,gp_orange[i-1]))    lp_orange.append(L)# 对apple和orange的Laplace金字塔进行1/2拼接LS = []for la,lb in zip(lp_apple,lp_orange):    rows,cols,dpt = la.shape    ls = np.hstack((la[:,0:cols/2],lb[:,cols/2:]))    LS.append(ls)# 对拼接后的Laplace金字塔重建获取融合后的结果ls_reconstruct = LS[0]for i in xrange(1,6):    ls_reconstruct = cv2.pyrUp(ls_reconstruct)    ls_reconstruct = cv2.add(sameSize(ls_reconstruct,LS[i]), LS[i])# 各取1/2直接拼接的结果r,c,depth = apple.shapereal = np.hstack((apple[:,0:c/2],orange[:,c/2:]))plt.subplot(221), plt.imshow(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB))plt.title("apple"),plt.xticks([]),plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(orange,cv2.COLOR_BGR2RGB))plt.title("orange"),plt.xticks([]),plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(real,cv2.COLOR_BGR2RGB))plt.title("real"),plt.xticks([]),plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(ls_reconstruct,cv2.COLOR_BGR2RGB))plt.title("laplace_pyramid"),plt.xticks([]),plt.yticks([])plt.show()

注意:图像先经过降采样,然后再上采样恢复的时候大小可能不同,这会导致后面的拼接出现问题,因为调用函数cv2.subtrack()和函数cv2.add()需要保证两幅图像尺寸、通道数完全相同,否则会报错。

运行结果为:


测试图片

0 0
原创粉丝点击