一、高斯金字塔&拉普拉斯金字塔概念
1.1 高斯金字塔
高斯金字塔两个操作reduce&expand:
(1)reduce=高斯模糊+降采样(例直接取偶数行)
(2)expand=扩大(上采样)+卷积
1.2 拉普拉斯金字塔
例:左为高斯金字塔,右为拉普拉斯金字塔。L1为拉普拉斯金字塔的某层,L1=g1-expand(g2)。
通过高斯金字塔可以得到拉普拉斯金字塔。Ln=gn-expand(gn-1)
二、实战
2.1 高斯金字塔cv.pyrDown
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
''''''
def pyramid_demo(image):
level=3#定义金字塔层数
temp=image.copy()
pyramid_images=[]
for i in range(level):
dst=cv.pyrDown(temp)
pyramid_images.append(dst)
cv.imshow('pyramid_down_'+str(i+1),dst)
temp=dst.copy()
return pyramid_images
img=cv.imread(r'D:\Project\Opencv\Learning01\angelababy.jpg')
cv.imshow('origin',img)
pyramid_demo(img)
cv.waitKey(0)
2.2 拉普拉斯金字塔cv.pyrUp
拉普拉斯金字塔的前提是先有高斯金字塔
拉普拉斯金字塔必须使用 方形或长宽为2的n次方 的图片 ,否者出现error: (-215:Assertion failed) std::abs(dsize.width - ssize.width*2) == dsize.width % 2…错误。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''高斯金字塔'''
def pyramid_demo(image):
level=3#定义金字塔层数
temp=image.copy()
pyramid_images=[]
for i in range(level):
dst=cv.pyrDown(temp)
pyramid_images.append(dst)
cv.imshow('pyramid_down_'+str(i+1),dst)
temp=dst.copy()
return pyramid_images#没有原图
"""拉普拉斯金字塔"""
def lap_demo(image):
'''拿到高斯金字塔'''
pyramid_images=pyramid_demo(image)#得到高斯金字塔
level=len(pyramid_images)
print('222222222222222222222222222')
for i in range(level-1,-1,-1):#从最小的高斯金字塔开始,到最大的金字塔(没有包含原图)
if (i-1)<0:#原图
expand=cv.pyrUp(pyramid_images[i],dstsize=image.shape[:2])
lpls=cv.subtract(image,expand)
cv.imshow('lap_up'+str(i),lpls)
else:
expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i-1].shape[:2])
lpls = cv.subtract(pyramid_images[i-1], expand) # 得到拉普拉斯金字塔
cv.imshow('lap_up'+str(i), lpls)
img=cv.imread(r'D:\Project\Opencv\Learning01\fang.png')
cv.imshow('origin',img)
lap_demo(img)
cv.waitKey(0)