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

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

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

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'

import cv2
import numpy as np
from matplotlib import pyplot as plt


def sameSize(img1, img2):
    """
    使得img1的大小与img2相同
    """
    rows, cols, dpt = img2.shape
    dst = img1[:rows,:cols]
    return dst


apple = 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.shape
real = 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()需要保证两幅图像尺寸、通道数完全相同,否则会报错。

运行结果为:

Python+OpenCV学习(14)---Laplace金字塔进行图像融合_第1张图片Python+OpenCV学习(14)---Laplace金字塔进行图像融合_第2张图片Python+OpenCV学习(14)---Laplace金字塔进行图像融合_第3张图片

测试图片

你可能感兴趣的:(OpenCV)