VPI - Vision Programming Interface

3.2 Release

Rescale

概述

Rescale 算法用于缩放输入图像,通过重采样其内容使其符合输出图像的尺寸。

不应用预滤波,期望输入内容没有高于奈奎斯特极限的频率,以避免在下采样时产生混叠伪影。

有几种插值方法可用,允许在质量和性能之间进行权衡。

输入因子输出

\begin{align*} f_x &= 2/3 \\[5pt] f_y &= 3/2 \end{align*}

实现

对于每个输出像素,使用以下公式计算对应的输入像素

\[ \mathit{out}[x,y] = P(f_x x, f_y y) \]

其中 P 取决于使用的插值方法。

采样操作认为整数坐标落在像素中心。

C API 函数

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

函数描述
vpiSubmitRescale 更改 2D 图像的大小和比例。

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 缩放 VPI 图像输入,使输出具有原始宽度的 66%,高度增加 50%,全部使用 CUDA 后端。它使用线性插值。
    with vpi.Backend.CUDA
    output = input.rescale((input.width*2//3, input.height*3//2), interp=vpi.Interp.LINEAR, border=vpi.Border.ZERO)
  1. 初始化阶段
    1. 包含定义 rescale 函数的头文件。
      声明实现 Rescale 算法的函数。
    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 * 2 / 3.0f, h * 3 / 2.0f, 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. 将算法连同所有参数提交到流。它将由 CUDA 算法执行。
      VPIStatus vpiSubmitRescale(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, VPIInterpolationType interpolationType, VPIBorderExtension border, uint64_t flags)
      更改 2D 图像的大小和比例。
      @ VPI_BACKEND_CUDA
      CUDA 后端。
      定义: Types.h:93
      @ VPI_BORDER_ZERO
      图像外部的所有像素都被视为零。
      定义: Types.h:278
      @ VPI_INTERP_LINEAR
      线性插值。
    2. 可选地,等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有已提交命令都完成(队列为空)。..
  3. 清理阶段
    1. 释放流以及输入和输出图像所持有的资源。
      vpiImageDestroy(output);
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

请查阅 Rescale 以获取完整示例。

有关更多信息,请参阅 VPI - Vision Programming Interface 的 “C API 参考” 部分中的 Rescale

性能

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

 - 

参考

  • Daniel Ruijters, Bart M. ter Romeny, Paul Suetens (2008) "Efficient GPU-Based Texture Interpolation using Uniform B-Spline"
    Journal of Graphics Tools, 13:4 61-69.