圖像金字塔一文中挪丢,已經(jīng)詳細(xì)介紹了圖像金字塔的MATLAB實(shí)現(xiàn),這里貼上OpenCV Python的實(shí)現(xiàn)以做補(bǔ)充卢厂。在OpenCV中乾蓬,主要使用cv2.pyrDown和cv2.pyrUp兩個函數(shù),在沒有指定輸出圖像的大小的情況下慎恒,下采樣的圖像尺寸會進(jìn)行四舍五入任内。比如,189x189的圖像會亞采樣為95x95大小融柬。為了保證在拉普拉斯金字塔和圖像重建過程中的圖像大小一致死嗦,下面的函數(shù)限制了下采樣、上采樣的輸出圖像大辛Q酢(dstsize
參數(shù))越除。
import cv2
import numpy as np
def gaussian_pyr(img,lev):
img = img.astype(np.float)
g_pyr = [img]
cur_g = img;
for index in range(lev):
print(index)
cur_g = cv2.pyrDown(cur_g)
g_pyr.append(cur_g)
return g_pyr
def laplacian_pyr(img,lev):
img = img.astype(np.float)
g_pyr = gaussian_pyr(img,lev)
l_pyr = []
for index in range(lev):
cur_g = g_pyr[index]
cur_w,cur_h = np.shape(cur_g)
next_g = cv2.pyrUp(g_pyr[index+1],dstsize=(cur_h,cur_w))
cur_l = cv2.subtract(cur_g,next_g)
l_pyr.append(cur_l)
l_pyr.append(g_pyr[-1])
return l_pyr
def lpyr_recons(l_pyr):
lev = len(l_pyr)
cur_l = l_pyr[-1]
for index in range(lev-2,-1,-1):
#print(index)
next_w,next_h = np.shape(l_pyr[index])
cur_l = cv2.pyrUp(cur_l,dstsize=(next_h,next_w))
next_l = l_pyr[index]
cur_l = cur_l + next_l
return cur_l
對上面函數(shù)的測試:
#from Uti.pyr import *
#from Uti.utis import *
import imageio
import matplotlib.pyplot as plt
img = imageio.imread('LENA.JPG')
img = luminance(img)
m = gaussian_pyr(img,5)
for i in range(len(m)):
plt.imshow(m[i],cmap='gray')
plt.show()
g = laplacian_pyr(img,5)
for i in range(len(g)):
plt.imshow(g[i],cmap='gray')
plt.show()
t = lpyr_recons(g)
plt.imshow(t,cmap='gray')
plt.show()