目录
一、图像金字塔的作用
1、图像缩放
2、图像分割
二、采样
1、下采样pyrDown()
2、上采样pyrUp()
三、高斯金字塔
1、高斯金字塔过程
2、构建图像的高斯金字塔
四、拉普拉斯金字塔
1、拉普拉斯金字塔的数学定义
2、构建图像的拉普拉斯金字塔
五、图像复原
1、原图像的复原公式
用于机器视觉和图像压缩,一副较大的图像可以通过梯次向下采样(删除偶数行/列的像素)缩小图像
图像分割,先要建立一个图像金字塔,然后在相邻两层(G_i层和G_i+1层)的像素直接依照对应的关系,建立起”父与子“关系。而快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。
直接删除图像偶数行/列的像素,图像尺寸减半会丢失一些数据信息。
图像在每个维度上扩大为原来的两倍,即:(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,新增的偶数行/列补0填充。然后用给定的滤波器卷积(每个维度都扩大为原来两倍的过滤器)去估计丢失像素的近似值。
pyrDown()和pyrUp()不是一个互逆的过程,值是简单的对图像进行放大和缩小,但绝对不是图像复原。如果要图像复原必须结合高斯金字塔和拉普拉斯金字塔
高斯金字塔本质上为信号的多尺度表示法
import cv2 as cv
import numpy as np
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), dst)
temp = dst.copy()
return pyramid_images
下式是拉普拉斯金字塔第i层的数学定义:
式中的Gi表示第i层高斯图像。而UP()操作是将源图像中位置为(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,即在进行向上取样。符号表示卷积,为5x5的高斯内核。
因此,我们可以直接用OpenCV进行拉普拉斯运算:
因此:可以说成拉普拉斯金字塔=第i层的高斯塔——第i+1层pyrUp()放大(上采样)后的高斯塔
注:i+1层是比i层小的图像
import cv2 as cv
import numpy as np
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), dst)
temp = dst.copy()
return pyramid_images
def lapalian_demo(image):
dst = cv.resize(src, (image.shape[1], image.shape[1]), 0, 0, cv.INTER_LINEAR)#重新改变图像的尺寸,求拉普拉斯塔输入图像必须为方形
#cv.imshow("dst", dst)
pyramid_images = pyramid_demo(dst)
level = len(pyramid_images)
for i in range(level-1, -1, -1):
if (i-1) < 0 :
expand = cv.pyrUp(pyramid_images[i], dstsize=dst.shape[:2])
lpls = cv.subtract(dst, expand)
cv.imshow("lapalian_down_" + 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("lapalian_down_"+str(i), lpls)
第i层高斯金字塔=第i层拉普拉斯塔+第i+1层pyrUp()放大(上采样)后的高斯塔