VPI - 视觉编程接口

3.2 版本

方框滤波器

概述

方框滤波器是一种低通滤波器,通过将每个输出像素设为周围像素的平均值来平滑图像,从而去除图像中的细节、噪声和边缘。

输入窗口大小输出
5x5

C API 函数

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

函数描述
vpiSubmitBoxFilter 对图像运行 2D 方框滤波器。

实现

方框滤波器实现为对输入图像进行卷积运算,使用的内核如下

\[ box_{m,n} = \frac{1}{mn} \begin{bmatrix} 1 & 1 & \dots & 1 \\ 1 & 1 & \dots & 1 \\ \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & \dots & 1 \end{bmatrix}_{m \times n} \]

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 使用 CUDA 后端和 5x5 方框内核以及 ZERO 边界条件来过滤输入图像。输入和输出均为 VPI 图像。
    with vpi.Backend.CUDA
    output = input.box_filter(5, border=vpi.Border.ZERO)
  1. 初始化阶段
    1. 包含定义方框滤波器函数的头文件。
      声明实现方框滤波器算法的函数。
    2. 定义输入图像对象。
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像的句柄。
      定义: Types.h:256
    3. 创建输出图像。它从输入图像获取其尺寸和格式。
      int32_t w, h;
      vpiImageGetSize(input, &w, &h);
      vpiImageGetFormat(input, &type);
      VPIImage output;
      vpiImageCreate(w, h, type, 0, &output);
      uint64_t VPIImageFormat
      预定义的图像格式。
      VPIStatus vpiImageGetFormat(VPIImage img, VPIImageFormat *format)
      获取图像格式。
      VPIStatus vpiImageCreate(int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
      使用指定的标志创建空的图像实例。
      VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
      以像素为单位获取图像尺寸。
    4. 创建将在其中提交算法以供执行的流。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      定义: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
  2. 处理阶段
    1. 将算法连同其他参数一起提交到流。在本例中,它是具有 clamp 边界扩展的 5x5 方框滤波器。它将由 CUDA 后端执行。
      vpiSubmitBoxFilter(stream, VPI_BACKEND_CUDA, input, output, 5, 5, VPI_BORDER_CLAMP);
      VPIStatus vpiSubmitBoxFilter(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, int32_t kernelWidth, int32_t kernelHeight, VPIBorderExtension border)
      对图像运行 2D 方框滤波器。
      @ VPI_BACKEND_CUDA
      CUDA 后端。
      定义: Types.h:93
      @ VPI_BORDER_CLAMP
      边界像素无限重复。
      定义: Types.h:279
    2. 可选地,等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有提交命令都完成(队列为空)。
  3. 清理阶段
    1. 释放流以及输入和输出图像所持有的资源。
      vpiImageDestroy(output);
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅 VPI - 视觉编程接口 的 “C API 参考” 部分中的 方框滤波器

性能

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

 -