import cv2 as cv
import numpy as np
img = cv.imread('./shangyi.jpg',cv.IMREAD_COLOR)
#高斯金字塔
#pyrDown利用高斯模糊降低图片分辨率,原图分辨率的1/2
#取原图5个像素点进行高斯加权平均,得到新的像素点,将新的像素点排列成新的图像,图像分辨率下降
lower = cv.pyrDown(img)
lower1 = cv.pyrDown(lower)
#pyrUp利用高斯模糊扩展图片分辨率,原图分辨率*2
#扩展图片分辨率,再用高斯模糊进行图像平滑处理
upper = cv.pyrUp(lower)
upper1 = cv.pyrUp(lower1)
#拉普拉斯金字塔 => 高斯金字塔的边缘保留版
#拉普拉斯金字塔的层由高斯金字塔的层与高斯金字塔的高层的扩展版本之间的差形成。(分辨率高-分辨率低的扩展)
lpls = cv.subtract(lower,upper1)
#利用金字塔混合图像
#图像a
pictureA = cv.imread('./shangyi.jpg')
#图像b
pictureB = cv.imread('./hudie.jpg')
#a的高斯金字塔
copya = pictureA.copy()
gpa = [copya] #高斯金字塔列表 => 原图+3层降分辨率层
for i in range(3):
copya = cv.pyrDown(copya)
gpa.append(copya)
#b的高斯金字塔
copyb = pictureB.copy()
gpb = [copyb] #高斯金字塔列表 => 原图+3层降分辨率层
for i in range(3):
copyb = cv.pyrDown(copyb)
gpb.append(copyb)
#a的拉普拉斯金字塔
lpa = [gpa[3]] #拉普拉斯金字塔列表 => 第3层高斯降频图+3层拉普拉斯图
for i in range(3,0,-1):
rows,cols,dpt = gpa[i-1].shape
up = cv.pyrUp(gpa[i])
if(rows<len(up)):
up = up[:rows,:]
sub = cv.subtract(gpa[i-1],up)
lpa.append(sub)
#b的拉普拉斯金字塔
lpb = [gpb[3]] #拉普拉斯金字塔列表 => 第3层高斯降频图+3层拉普拉斯图
for i in range(3,0,-1):
rows,cols,dpt = gpb[i-1].shape
up = cv.pyrUp(gpb[i])
if(rows<len(up)):
up = up[:rows,:]
sub = cv.subtract(gpb[i-1],up)
lpb.append(sub)
#取a图像的左半边,取b图像的右半边并合并
merge = []
for la,lb in zip(lpa,lpb):
rows,cols,dpt = la.shape
lm = np.hstack((la[:,:int(cols/2)],lb[:,int(cols/2):])) #参数类型tuple => (list1,list2...) hstack:列合并
merge.append(lm)
#最后一次的高斯降频图为底,进行图像叠加
ls = merge[0]
for i in range(1,4):
ls = cv.pyrUp(ls)
if(len(ls)>len(merge[i])):
ls = ls[:len(merge[i]),:]
ls = cv.add(ls,merge[i])
cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',lower)
key = cv.waitKey(0)
cv.imshow('img',lower1)
key = cv.waitKey(0)
cv.imshow('img',upper)
key = cv.waitKey(0)
cv.imshow('img',lpls)
key = cv.waitKey(0)
cv.imshow('img',ls)
key = cv.waitKey(0)
cv.destroyAllWindows()
这里需要注意cv.pyrDown的结果可能会丢失像素,原因是像素量不能被2整除,因此会出现像素矩阵相减失败的情况
eq: 135/2 = 68 68*2 = 136 135!=136