VPI - 视觉编程接口

3.2 版本

拉普拉斯金字塔生成器

概述

拉普拉斯金字塔是一种图像表示方法,它由一组带通图像和一个低频残差组成。

应用范围从图像压缩到细节处理,其中输入图像被分解为表示为拉普拉斯金字塔的频带。每个频带都可以独立操作。最终图像可以通过将所有频带和低频残差相加来重建。

输入高斯金字塔输出(可选)拉普拉斯金字塔输出


实现

VPI 将近似的拉普拉斯金字塔实现为高斯金字塔的差分,如下所示

拉普拉斯金字塔算法高层实现

拉普拉斯金字塔的第 k 层可以通过以下公式获得

\[ L_k(I) = G_k(I) - u(G_{k+1}(I)) \]

其中

  • \(I\) 是输入图像。
  • \(L_k(I)\) 是拉普拉斯金字塔的第 k 层。
  • \(G_k(I)\) 是高斯金字塔的第 k 层。
  • \(u(\bullet)\) 是 2 倍放大操作。

该算法重复执行直到生成所有层级。

VPI 实现可以选择性地返回计算中使用的中间高斯金字塔,以防也需要这种表示。这样做不会产生性能损失。

C API 函数

有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档

函数描述
vpiSubmitLaplacianPyramidGenerator 从输入图像计算拉普拉斯金字塔。

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. (可选)创建一个 4 级 VPI 金字塔,用于存储高斯金字塔副产品。它使用 VPI 图像输入来获取其尺寸和格式。
    gaussian = vpi.Pyramid(input.size, input.format, 4)
  3. 返回使用 CUDA 后端从输入图像创建的 4 级拉普拉斯金字塔。它还返回相应的高斯金字塔。输入是 VPI 图像,输出是 VPI 金字塔。
    with vpi.Backend.CUDA
    output = input.laplacian_pyramid(4, out_gaussian=gaussian)
  1. 初始化阶段
    1. 包含定义拉普拉斯金字塔生成器函数的头文件
      声明处理拉普拉斯金字塔的函数。
    2. 定义输入图像对象
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像句柄。
      定义: Types.h:256
    3. 使用所需的层级数(在本例中为 4)和缩放因子(固定为 0.5)创建输出金字塔
      int32_t w, h;
      vpiImageGetSize(input, &w, &h);
      VPIPyramid output;
      vpiPyramidCreate(w, h, VPI_IMAGE_FORMAT_F32, 4, 0.5, 0, &output);
      #define VPI_IMAGE_FORMAT_F32
      具有一个 32 位浮点通道的单平面。
      VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
      获取图像尺寸(以像素为单位)。
      VPIStatus vpiPyramidCreate(int32_t width, int32_t height, VPIImageFormat fmt, int32_t numLevels, float scale, uint64_t flags, VPIPyramid *pyr)
      创建具有指定标志的空图像金字塔实例。
      struct VPIPyramidImpl * VPIPyramid
      图像金字塔的句柄。
      定义: Types.h:262
    4. 可选地,创建与拉普拉斯金字塔输出具有相同尺寸的高斯金字塔。其图像格式必须与输入图像的格式相同
      vpiImageGetFormat(input, &type);
      VPIPyramid gaussianPyr;
      vpiPyramidCreate(w, h, type, 4, 0.5, 0, &gaussianPyr);
      uint64_t VPIImageFormat
      预定义的图像格式。
      VPIStatus vpiImageGetFormat(VPIImage img, VPIImageFormat *format)
      获取图像格式。
    5. 创建流,算法将提交到该流以执行
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      定义: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
  2. 处理阶段
    1. 将算法连同输入图像、输出金字塔和可选的高斯金字塔提交到流。该算法由 CPU 后端执行
      VPIStatus vpiSubmitLaplacianPyramidGenerator(VPIStream stream, uint64_t backend, VPIImage input, VPIPyramid output, VPIPyramid gaussianPyr, VPIBorderExtension border)
      从输入图像计算拉普拉斯金字塔。
      @ VPI_BACKEND_CPU
      CPU 后端。
      定义: Types.h:92
      @ VPI_BORDER_CLAMP
      边界像素无限重复。
      定义: Types.h:279
    2. (可选)等待直到处理完成
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)。
  3. 清理阶段
    1. 释放流、输入图像、输出金字塔和可选高斯金字塔所持有的资源
      vpiPyramidDestroy(gaussianPyr);
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiPyramidDestroy(VPIPyramid pyr)
      销毁图像金字塔实例以及它拥有的所有资源。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅 VPI - 视觉编程接口 的“C API 参考”部分中的 拉普拉斯金字塔生成器

限制和约束

CPU 和 CUDA 后端

  • 输入图像和金字塔的基层必须具有相同的尺寸。
  • 仅支持 scale=0.5(即,只能生成二元金字塔)。
  • 如果使用高斯金字塔,则其图像必须与输入图像具有相同的格式。
  • 以下图像格式被接受为输入图像
  • 以下图像格式被接受为输出拉普拉斯金字塔
  • 拉普拉斯金字塔的最粗糙层在概念上等同于高斯金字塔的最粗糙层。但是,在拉普拉斯金字塔输出格式的正动态范围小于输入格式的情况下,即输入格式为 VPI_IMAGE_FORMAT_U8,输出格式为 VPI_IMAGE_FORMAT_S8 或 U16 和 S16,最粗糙层中输出的像素值除以 2 以避免溢出。

其他后端

  • 不支持。

性能

有关如何使用下表性能表的信息,请参阅 算法性能表
在比较测量结果之前,请查阅 比较算法运行时间
有关性能基准测试的更多信息,请参阅 性能基准

 -