高斯滤波的核就是一个求平均值的卷积核
高斯金字塔也是一个高斯核,只是步长为2,卷积后图片缩小二倍。高斯金字塔的目的是在图像不同大小时可以获得不同的信息,比如说图像较小时可以获得轮廓,图像较大时可以获得细节
使用函数cv2.pyrDown(image)
拉普拉斯金字塔作用后的效果就是不同层次下提取边缘,原理就是基于高斯金字塔下,从高斯金字塔塔尖开始,每层图片扩大二倍,与下一层做差,得到的新图
使用函数cv2.pyrUp(image) cv2.subtract(image1,image2)
值得注意的坑是拉普拉斯金字塔的原图必须是2的n次方,不然会出现BUG
实现代码如下:
高斯模糊卷积核写错了,纠正方法见图像处理(十六)对高斯模糊进行了重新定义,这个卷积核是均值模糊
import numpy as np
import cv2
import random
#高斯模糊未考虑权重
# gausf = np.asarray([[1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]])
# image = cv2.imread('test.jpg',0)
# hight,width = image.shape
# for i in range(5000):
# h = random.randint(1,hight-1)
# w = random.randint(1,width-1)
# image[h,w] = 255
# img = np.zeros((hight,width))
# for i in range(1,hight-1):
# for j in range(1,width-1):
# img[i-1,j-1] = np.sum(image[i-1:i+2,j-1:j+2]*gausf)
# cv2.imshow('image',image)
# cv2.imshow('test',img.astype(np.uint8))
# cv2.waitKey(0)
# cv2.destroyWindow()
#高斯金字塔
path = 'test.jpg'
image = cv2.imread(path,0)
image = cv2.resize(image,(512,512))
step = 5
def gaussian(image,step):
image_list = []
temp = image.copy()
for i in range(step):
img = cv2.pyrDown(temp)
temp = img.copy()
image_list.append(temp)
return image_list
# for i in range(step):
# img = image_list[i]
# cv2.imshow('test'+str(i),img)
def lapulasi(image,step):
lapu_list = []
image_list = gaussian(image,step)
le = len(image_list)
for i in range(le-1,-1,-1):
if (i-1)<0:
ext = cv2.pyrUp(image_list[i])
result = cv2.subtract(image,ext)
lapu_list.append(result)
else:
ext = cv2.pyrUp(image_list[i])
print(ext.shape)
print(image_list[i-1].shape)
result = cv2.subtract(image_list[i-1],ext)
lapu_list.append(result)
return lapu_list
lapu_list = lapulasi(image,step)
for i in lapu_list:
cv2.imshow('test'+str(i),i)
cv2.waitKey(0)
cv2.destroyWindows()
效果图如下:
这是高斯金字塔
下面是拉普拉斯金字塔