python-opencv 图像金字塔

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值