VPI - 视觉编程接口

3.2 版本

图像统计

概述

图像统计算法对输入图像执行二维 (2D) 操作,并使用相同尺寸的提供的掩码图像。掩码定义了操作中考虑的像素。该算法计算每个通道的统计信息,包括像素计数、总和、均值、方差、以及由掩码图像掩盖的输入图像的协方差。方差和协方差都存储在一个 4x4 协方差矩阵中,其中对角线是方差,非对角线元素是每个通道的协方差,最多考虑 4 个通道。

输入参数输出
掩码作为 NULL 传递(考虑所有像素)。
Flag is VPI_STAT_COVARIANCE

\[ 像素计数 = 393216 \]

\[ 逐通道总和: \begin{bmatrix} 50316744 & 47610060 & 45611460 & 0 \\ \end{bmatrix} \]

\[ 逐通道均值: \begin{bmatrix} 127.962097 & 121.078644 & 115.995941 & 0 \\ \end{bmatrix} \]

\[ 协方差矩阵: \begin{bmatrix} 4062.606201 & 4022.210693 & 3351.239990 & 0 \\ 4022.210693 & 4263.414551 & 3651.921387 & 0\\ 3351.239990 & 3351.239990 & 3293.198730 & 0\\ 0 & 0 & 0 & 0 \end{bmatrix} \]

实现

图像统计功能通过计算由掩码图像定义的输入图像的各种逐通道统计信息来工作。可以计算的各种统计信息都有其自己的标志。输出存储在类型为 VPI_ARRAY_TYPE_STATISTICS 的数组中。用户可以选择应计算哪些统计信息。

*有效 - 此处有效指的是具有相应非零掩码像素的输入图像像素。

C API 函数

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

函数描述
vpiSubmitImageStats 返回输入图像的各种图像统计信息。

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 使用 CUDA 后端在输入图像上运行图像统计算法。
    with vpi.Backend.CUDA
    output = input.image_stats(flags=vpi.ImageStatistics.COVARIANCE)
  3. 从输出数组访问统计信息。
    stats = output.cpu().view(np.recarray)[0]
    print(stats.covariance[0][0])
  1. 初始化阶段
    1. 包含定义所需函数和结构的头文件。
      声明实现图像统计算法的函数。
    2. 定义输入图像对象。
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像的句柄。
      定义: Types.h:256
    3. 创建输出数组。它必须是 VPI_ARRAY_TYPE_STATISTICS 类型。
      VPIArray output;
      VPIStatus vpiArrayCreate(int32_t capacity, VPIArrayType type, uint64_t flags, VPIArray *array)
      创建空的数组实例。
      struct VPIArrayImpl * VPIArray
      数组的句柄。
      定义: Types.h:232
      @ VPI_ARRAY_TYPE_STATISTICS
      VPIStats 元素。
    4. 创建将在其中提交算法以供执行的流。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      定义: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
    5. 创建要使用的掩码图像。它必须与输入图像的尺寸匹配。如果不需要掩码,则可以为 NULL。必须是 VPI_IMAGE_FORMAT_U8 格式。
      VPIImage mask;
      LoadImage(argv[2], VPI_IMAGE_FORMAT_U8, &mask);
      #define VPI_IMAGE_FORMAT_U8
      具有一个 8 位无符号整数通道的单平面。
  2. 处理阶段
    1. 提交图像统计算法。它将由 CUDA 后端执行。
      #define VPI_STAT_COVARIANCE
      计算完整的协方差矩阵。
      定义: Types.h:767
      VPIStatus vpiSubmitImageStats(VPIStream stream, uint64_t backend, VPIImage input, VPIArray statistics, VPIImage mask, uint32_t flags)
      返回输入图像的各种图像统计信息。
      @ VPI_BACKEND_CUDA
      CUDA 后端。
      定义: Types.h:93
    2. 可选地,等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有提交命令都完成(队列为空)。。
  3. 清理阶段
    1. 释放流以及输入和输出图像所持有的资源。
      vpiArrayDestroy(output);
      void vpiArrayDestroy(VPIArray array)
      销毁数组实例。
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅 VPI - 视觉编程接口 的 “API 参考” 部分中的 图像统计

性能

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

 -