OpenCV 图像金字塔原理与实现
目标
在本教程中,您将学习如何:
- 使用 OpenCV 函数 pyrUp() 和 pyrDown() 对给定图像进行下采样或上采样。
理论
下面的解释属于 Bradski 和 Kaehler 所著的《Learning OpenCV》一书。
通常我们需要将图像转换为与原始图像不同的大小。为此,有两种可能的选择:
- 放大图像(Upsampling)或
- 缩小图像(Downsampling)。
尽管 OpenCV 中有一个几何变换函数 resize,可以从字面上调整图像大小,但在本节中,我们首先分析了图像金字塔的使用,它广泛应用于广泛的视觉应用。
图像金字塔
- 图像金字塔是图像的集合 - 所有图像都来自单个原始图像 - 这些图像连续下采样,直到达到某个所需的停止点。
- 图像金字塔有两种常见类型:
- 高斯金字塔:用于对图像进行下采样
- 拉普拉斯金字塔:用于从金字塔中较低的图像(分辨率较低)重建上采样图像
- 在本教程中,我们将使用高斯金字塔。
高斯金字塔
将金字塔想象成一组层,其中层越高,尺寸越小。

每一层都从下到上编号,因此层 G_{i+1} 小于层 G_i。
为了在高斯金字塔中生成层 G_{i+1},我们执行以下操作:
- 具有高斯核的卷积 G_i:
1/16 * [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] - 删除每个偶数行和列。
您可以很容易地注意到,生成的图像将恰好是其前身面积的四分之一。在输入图像 G_0(原始图像)上迭代此过程将生成整个金字塔。
上述过程对于图像的下采样很有用。如果我们想让它变大怎么办?
- 首先,将图像在每个维度上放大到原始图像的两倍,使用新的偶数行和列填充零(0)。
- 使用上面所示的相同内核(乘以 4)执行卷积以近似'缺失像素'的值。
这两个过程(如上所述的下采样和上采样)是由 OpenCV 函数 pyrDown() 和 pyrUp() 实现的,正如我们将在以下代码的示例中看到的那样。
注意:当我们减小图像的大小时,我们实际上是在丢失图像的信息。
代码示例 (C++)
本教程代码如下所示。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
* window_name = ;
{
cout <<
<<
<<
<<
<< << endl;
* filename = argc >= ? argv[] : ;
Mat src = (filename);
(src.()) {
();
();
EXIT_FAILURE;
}
(;;) {
(window_name, src);
c = ()();
(c == ) { ; }
(c == ) {
(src, src, (src.cols * , src.rows * ));
();
}
(c == ) {
(src, src, (src.cols / , src.rows / ));
();
}
}
EXIT_SUCCESS;
}




