概述
方框滤波器是一种低通滤波器,通过将每个输出像素设为周围像素的平均值来平滑图像,从而去除图像中的细节、噪声和边缘。
输入 | 窗口大小 | 输出 |
| 5x5 | |
C API 函数
有关实现该算法的限制、约束和后端的列表,请查阅以下函数的参考文档
实现
方框滤波器实现为对输入图像进行卷积运算,使用的内核如下
\[ 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} \]
用法
语言
- 导入 VPI 模块
- 使用 CUDA 后端和 5x5 方框内核以及 ZERO 边界条件来过滤输入图像。输入和输出均为 VPI 图像。
with vpi.Backend.CUDA
output = input.box_filter(5, border=vpi.Border.ZERO)
- 初始化阶段
- 包含定义方框滤波器函数的头文件。
- 定义输入图像对象。
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)
创建流实例。
- 处理阶段
- 将算法连同其他参数一起提交到流。在本例中,它是具有 clamp 边界扩展的 5x5 方框滤波器。它将由 CUDA 后端执行。
VPIStatus vpiSubmitBoxFilter(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, int32_t kernelWidth, int32_t kernelHeight, VPIBorderExtension border)
对图像运行 2D 方框滤波器。
@ VPI_BACKEND_CUDA
CUDA 后端。
@ VPI_BORDER_CLAMP
边界像素无限重复。
- 可选地,等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有提交命令都完成(队列为空)。
- 清理阶段
- 释放流以及输入和输出图像所持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关更多信息,请参阅 VPI - 视觉编程接口 的 “C API 参考” 部分中的 方框滤波器。
性能
有关如何使用以下性能表的信息,请参阅 算法性能表。
在比较测量结果之前,请查阅 比较算法运行时间。
有关性能基准测试方式的更多信息,请参阅 性能基准。
-