OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
图像金字塔

上一篇教程: 使用形态学操作提取水平和垂直线
下一篇教程: 基本阈值操作

原始作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,您将学习如何

  • 使用OpenCV函数 pyrUp()pyrDown() 对给定图像进行下采样或上采样。

理论

注意
以下解释摘自Bradski和Kaehler的著作《学习OpenCV》。
  • 通常我们需要将图像转换为与原始尺寸不同的尺寸。为此,有两种可能的选择:
    1. 放大图像(放大显示)或
    2. 缩小图像(缩小显示)。
  • 尽管OpenCV中有一个*几何变换*函数可以(字面上地)调整图像大小(resize,我们将在未来的教程中展示),但在本节中,我们首先分析图像金字塔的使用,它在各种视觉应用中得到了广泛应用。

图像金字塔

  • 图像金字塔是一组图像的集合——它们都源自单一原始图像——通过逐级下采样生成,直到达到所需的终止点。
  • 图像金字塔有两种常见类型:
    • 高斯金字塔: 用于下采样图像
    • 拉普拉斯金字塔: 用于从金字塔中较低层(分辨率较低)的图像重建上采样图像
  • 在本教程中,我们将使用*高斯金字塔*。

高斯金字塔

  • 将金字塔想象成一组层,层越高,尺寸越小。
  • 每层从下到上编号,因此层 \((i+1)\)(表示为 \(G_{i+1}\))小于层 \(i\)(\(G_{i}\))。
  • 要在高斯金字塔中生成层 \((i+1)\),我们执行以下操作:

    • 将 \(G_{i}\) 与高斯核进行卷积

    \[\frac{1}{256} \begin{bmatrix} 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{bmatrix}\]

    • 移除所有偶数行和偶数列。
  • 您会很容易注意到,结果图像的面积将恰好是其前一图像的四分之一。在输入图像 \(G_{0}\)(原始图像)上重复此过程,即可生成整个金字塔。
  • 上述过程对于图像下采样很有用。如果我们想放大图像怎么办?:用零 ( \(0 \)) 填充列
    • 首先,将图像的每个维度放大到原始尺寸的两倍,并包含新的偶数行和
    • 使用上面显示(乘以4)的相同核进行卷积,以近似“缺失像素”的值
  • 这两个过程(如上所述的下采样和上采样)由OpenCV函数 pyrUp()pyrDown() 实现,我们将在下面的代码示例中看到。
注意
当我们减小图像尺寸时,实际上是丢失了图像信息。

代码

本教程的代码如下所示。

解释

让我们检查一下程序的总体结构

加载图像

创建窗口

循环

执行一个无限循环,等待用户输入。如果用户按下 ESC 键,程序将退出。此外,它还有两个选项:

  • 执行上采样 - 放大(按下 'i' 后)

    我们使用带有三个参数的函数 pyrUp()

    • src:当前和目标图像(将在屏幕上显示,应为输入图像的两倍)
    • Size( tmp.cols*2, tmp.rows*2 ) :目标尺寸。由于我们正在进行上采样,pyrUp() 期望的尺寸是输入图像(在本例中为 src)的两倍。
  • 执行下采样 - 缩小(按下 'o' 后)

    我们使用带有三个参数的函数 pyrDown()(与 pyrUp() 类似):

    • src:当前和目标图像(将在屏幕上显示,应为输入图像的一半)
    • Size( tmp.cols/2, tmp.rows/2 ) :目标尺寸。由于我们正在进行下采样,pyrDown() 期望的尺寸是输入图像(在本例中为 src)的一半。

请注意,输入图像的尺寸(两个维度)必须能被二整除。否则,将显示错误。

结果

  • 程序默认调用 `samples/data` 文件夹中的图像 chicky_512.png。请注意,该图像尺寸为 \(512 \times 512\),因此下采样不会产生任何错误(\(512 = 2^{9}\))。原始图像如下所示:
  • 首先,我们通过按下 'd' 键执行两次连续的 pyrDown() 操作。输出如下:
  • 请注意,由于我们减小了图像尺寸,应该会损失一些分辨率。在我们两次应用 pyrUp()(通过按下 'u' 键)后,这一点变得显而易见。现在的输出是: