概述
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 函数
有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档
用法
语言
C/C++
Python
导入 VPI 模块
缩放 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)
初始化阶段
包含定义 rescale 函数的头文件。
定义输入图像对象。
struct VPIImageImpl * VPIImage
图像的句柄。
使用新的所需大小和与输入相同的格式创建输出图像。int32_t w, h;
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)
以像素为单位获取图像尺寸。
创建将在其中提交算法以供执行的流。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
处理阶段
将算法连同所有参数提交到流。它将由 CUDA 算法执行。
VPIStatus vpiSubmitRescale(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, VPIInterpolationType interpolationType, VPIBorderExtension border, uint64_t flags)
更改 2D 图像的大小和比例。
@ VPI_BACKEND_CUDA
CUDA 后端。
@ VPI_BORDER_ZERO
图像外部的所有像素都被视为零。
可选地,等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有已提交命令都完成(队列为空)。..
清理阶段
释放流以及输入和输出图像所持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
请查阅 Rescale 以获取完整示例。
有关更多信息,请参阅 VPI - Vision Programming Interface 的 “C API 参考” 部分中的 Rescale 。
性能
有关如何使用下表中的性能信息,请参阅算法性能表 。 在比较测量结果之前,请查阅比较算法运行时间 。 有关性能基准测试方式的更多信息,请参阅性能基准 。
清除过滤器
设备
Jetson AGX Orin
- 流
1
2
4
8
参考
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.