VPI - 视觉编程接口

3.2 版本

直方图均衡化

概述

直方图均衡化是一种在图像处理中使用图像直方图进行对比度调整的方法。 更多信息,请参阅 [1]

输入输出

实现

此算法尝试基于直方图查找新的映射调色板。 考虑一个灰度图像 X,图像中灰度级的总数为 L。将图像的直方图表示为 \(H_x\)。 图像中级别为 \(i\) 的像素出现的概率为

\[ p[i] = H_x[i] / N \]

其中

  • \(N\) 是图像中像素的总数。

对应于 \(p[i]\) 的累积分布函数为

\[ cdf_x[i] = \sum_{j=0}^{i}p[j] \]

使用累积分布函数将原始像素值转换为新的像素值,对应的像素值为

\[ y[i] = \sum_{j=0}^{i}p[j] * L \]

均衡化后图像直方图示例

输入均衡化输出

C API 函数

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

函数描述
vpiCreateEqualizeHist vpiSubmitEqualizeHist 创建负载。
vpiSubmitEqualizeHist 均衡化图像的直方图。

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 使用 CUDA 后端均衡化输入图像直方图,创建带有结果的输出 VPI 图像。
    with vpi.Backend.CUDA
    output = input.eqhist()
  1. 初始化阶段
    1. 包含定义图像直方图均衡化函数的头文件。
      声明均衡化源图像直方图的函数。
    2. 定义输入图像。
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像的句柄。
      Definition: Types.h:256
    3. 创建输出图像。
      int w, h;
      vpiImageGetSize(input, &w, &h);
      VPIImage output;
      vpiImageCreate(w, h, VPI_IMAGE_FORMAT_U8, 0, &output);
      #define VPI_IMAGE_FORMAT_U8
      具有一个 8 位无符号整数通道的单平面。
      Definition: ImageFormat.h:100
      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. 由于此算法需要临时内存缓冲区,请在 CUDA 后端为其创建负载。
      VPIPayload payload;
      VPIStatus vpiCreateEqualizeHist(uint64_t backend, VPIImageFormat fmt, VPIPayload *payload)
      为 vpiSubmitEqualizeHist 创建负载。
      struct VPIPayloadImpl * VPIPayload
      算法负载的句柄。
      Definition: Types.h:268
      @ VPI_BACKEND_CUDA
      CUDA 后端。
      Definition: Types.h:93
    5. 创建将在其上提交算法以供执行的流。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      Definition: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
  2. 处理阶段
    1. 使用 CUDA 后端将算法连同所有参数提交到流。
      vpiSubmitEqualizeHist(stream, VPI_BACKEND_CUDA, payload, input, output);
      VPIStatus vpiSubmitEqualizeHist(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage input, VPIImage output)
      均衡化图像的直方图。
    2. (可选)等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)。
  3. 清理阶段
    1. 释放流以及输入和输出图像所持有的资源。
      vpiImageDestroy(output);
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiPayloadDestroy(VPIPayload payload)
      释放负载对象和所有关联的资源。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅VPI - 视觉编程接口的“C API 参考”部分中的 均衡化图像直方图

性能

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

 - 

参考

  1. https://en.wikipedia.org/wiki/Histogram_equalization