自学OPENCV+PYTHON+MACOS-X(4)图形金字塔进行苹果和橘子融合详解

来源:互联网 发布:源码baiboku 编辑:程序博客网 时间:2024/04/30 14:30

利用图像金字塔进行苹果和橘子的融合,并对代码进行注释

# -*- coding: utf-8 -*-import numpy as np,sysimport cv2if __name__ == '__main__':    A = cv2.imread('apple.jpg',0)    B = cv2.imread('orange.jpg',0)    G = A.copy()    gpA = [G]    for i in xrange(6):  #生成6层苹果图像高斯金字塔        G = cv2.pyrDown(G)        gpA.append(G)    G = B.copy()    gpB = [G]    for i in xrange(6): #生成6层橘子图像高斯金字塔        G = cv2.pyrDown(G)        gpB.append(G)    lpA = [gpA[5]]#lpA赋值苹果高斯金字塔尖端,也就是最小段    for i in xrange(5, 0, -1): #从苹果金字塔最尖端往上遍历        GE = cv2.pyrUp(gpA[i])#在高斯金字塔图层生成拉普拉斯金字塔图层        L = cv2.subtract(gpA[i-1], GE)  #此处需要注意,开始我使用的图片分辨率为320*240 连续除6次2,如果不能整除,代码会报错,此处是矩阵相加需要矩阵行列长度都相等        lpA.append(L) #添加进拉普拉斯金字塔    lpB = [gpB[5]]    for i in xrange(5, 0, -1):        GE = cv2.pyrUp(gpB[i])        L = cv2.subtract(gpB[i-1], GE)        lpB.append(L)    LS = []#LS为空list    for la,lb in zip(lpA, lpB): #利用zip把所有拉普拉斯金字塔变成list        rows,cols = la.shape        ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])) #苹果和橘子各半边按列对接        LS.append(ls)    ls_ = LS[0] #赋值金字塔最小端    for i in xrange(1, 6): #从小到大将对接好的图恢复成大图        ls_ = cv2.pyrUp(ls_)        ls_ = cv2.add(ls_, LS[I])     real = np.hstack((A[:,:cols/2], B[:, cols/2:]))#原图各半对接用来对比    cv2.imwrite('Pyramid_blending2.jpg', ls_)    cv2.imwrite('Direct_blending.jpg', real)    cv2.namedWindow('image')    cv2.namedWindow('image2')    cv2.imshow('image', ls_)    cv2.imshow('image2', real)    cv2.waitKey(0) & 0xFF    cv2.destroyAllWindows()