图像金子塔是由一幅图像的多个不同分辨率的子图所构成的图像集合,该组图像是由单个图像不断降采样所产生的,最小的图像可能仅仅有一个像素点
1. 理论基础
1.1 下采样
最简单的图像金字塔可以通过不断删除图像的偶数行和偶数列得到,(N * N) 到 (N/2 * N/2) ,图像大小变为原来的1/4
实际上下采样的过程是先滤波后删除偶数行列,有多种滤波器可以选择,例如:
- 邻域滤波器:采用邻域平均技术,产生平均金字塔
- 高斯滤波器:常用★
1.2 上采样
通常将图像的高度与宽度变为原来的两倍,往里面插值,通常是补零,在每列像素点的右侧插入值为0的列,在每行像素点的下方插入值为0的行
注意点:对于填充后的上采样图,像素范围是[0,255],由于其中3/4的像素点值为0,如果使用高斯滤波对其进行卷积运算,像素范围会变为[0,255/4],所以要将高斯滤波器系数乘以4,以保证像素的范围依旧是[0,255]
上采样和下采样两者不是可逆运算
2. 实验
下采样
cv2.pyrDown()
import cv2
img=cv2.imread('D:/hjb.jpg',cv2.IMREAD_GRAYSCALE)
r1=cv2.pyrDown(img)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
print(img.shape,r1.shape,r2.shape,r3.shape)
cv2.imshow("img",img)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/65cfa8e70db447ee7961c5e7b9f6724b.png)
上采样
cv2.pyrUp()
注:为了确保像素值区间在向上采样后与原始图像保持一致,需要将高斯滤波器的系数 * 4,但是函数里面自己调整好了,不需要手动调整
import cv2
img=cv2.imread("D:/hjb.jpg")
r1=cv2.pyrUp(img)
r2=cv2.pyrUp(r1)
r3=cv2.pyrUp(r2)
cv2.imshow("img",img)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/abaa3d72407c9dbbe89581412cffd053.png)
3. 采样的可逆性研究
先下采样,后上采样
import cv2
img=cv2.imread("D:/hjb.jpg")
down=cv2.pyrDown(img)
up=cv2.pyrUp(down)
diff=up-img
cv2.imshow("img",img)
cv2.imshow("up",up)
cv2.imshow("diff",diff)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/8797a22dcbdaf55cf6472832a0049674.png)
先上采样,后下采样
import cv2
img=cv2.imread("D:/hjb.jpg")
up=cv2.pyrUp(img)
down=cv2.pyrDown(up)
diff=down-img
cv2.imshow("img",img)
cv2.imshow("down",down)
cv2.imshow("diff",diff)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/9d5131d40a3498fbe9f87929e066e073.png)
4. 拉普拉斯金字塔
通过对金字塔中的小图像进行上采样以获取完整的大尺寸高分辨率图像
由于下采样时使用高斯滤波器处理后还要抛弃偶数行和偶数列,在上采样时如果要能复原,就要获取采样过程中丢失的信息,这些丢失的信息构成了拉普拉斯金字塔
首先高斯金字塔是G0不断高斯向下采样得到G1,G2,G3。相邻两个G,前一个图像-后一个的上采样得到拉普拉斯金子塔,获取原图像就是一个逆过程
import cv2
img=cv2.imread("D:/hjb.jpg")
G0=img
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/7dea329ccad4233c58bfb6f406f2876a.png)
由拉普拉斯金字塔恢复原图像
import cv2
img=cv2.imread("D:/hjb.jpg")
G0=img
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
#已知G3和拉普拉斯金字塔,恢复原始图像
G2=L2+cv2.pyrUp(G3)
G1=L1+cv2.pyrUp(G2)
G0=L0+cv2.pyrUp(G1)
cv2.imshow("G0",G0)
cv2.imshow("G1",G1)
cv2.imshow("G2",G2)
cv2.waitKey(0)
cv2.destroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/a3da39ba3387d2694ebc05b98b9dfd13.png)