图像金字塔
概念
将图像组合成金字塔的形状(底下大,上面小)
使用场景:特征提取
方法分为
- 高斯金字塔
- 拉普拉斯金字塔
一、高斯金字塔
1、向下采样法(缩小)
越采样越少,down sample,|是一个缩小操作;
- 将 \(G_i\) 与高斯内核卷积
- 将所有偶数行和列去除
$ \frac{1}{16} * \left[ \begin{matrix} 1 & 4 & 6 & 4 & 1 \ 4 & 16 & 24 & 16 & 4 \ 6 & 24 & 36 & 24 & 6 \ 4 & 16 & 24 & 16 & 4 \ 1 & 4 & 6 & 4 & 1 \end{matrix} \right] $
2、向上采样法(放大)
- 将图像在每个方向上 扩大为原来的两倍;新增的行列以 0 填充;
- 使用先前同样的内核(乘以4)与放大后的图像卷积获得近似值
$ \left[ \begin{matrix} 10 & 30 \ 56 & 96 \end{matrix} \right] \rightarrow \left[ \begin{matrix} 10 & 0 & 30 & 0 \ 0 & 0 & 0 & 0 \ 56 & 0 & 96 & 0 \ 0 & 0 & 0 & 0 \end{matrix} \right] $
3、实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
lena = cv2.imread('lena.jpg')
lena.shape # (263, 263, 3)
# 上采样
up = cv2.pyrUp(lena)
up.shape # (526, 526, 3)
# 下采样
down = cv2.pyrDown(lena)
down.shape # (132, 132, 3)
plt.imshow(up)
plt.imshow(down)
# 上采样后下采样,和原图大小一样,但有损失
up = cv2.pyrUp(lena)
up_down = cv2.pyrDown(up)
up_down.shape # (263, 263, 3)
plt.imshow(np.hstack((lena, up_down)))
二、拉普拉斯金字塔
$ L_i = G_i - PyrUp(PyrDown(G_i)) $
down = cv2.pyrDown(lena)
down_up = cv2.pyrUp(down, dstsize=(263,263))
l1 = lena - down_up
plt.imshow(l1)