概述
高斯滤波器是一种低通离散高斯滤波器,通过对给定输入像素的邻域像素进行高斯加权平均来平滑图像。 与 盒子滤波器 相比,它可以生成伪影更少的图像,但计算成本可能更高。
它支持两种操作模式
- 内核支持大小根据滤波器标准差(sigma)自动计算。
- 同时使用用户提供的内核支持大小和滤波器标准差。
输入 | 高斯内核 | 输出 |
| 7x7 支持, \[ \sigma=1.7 \]
| |
实现
高斯滤波器作为输入图像上的卷积运算实现,其中内核具有以下权重
\[ w_g[x,y] = \frac{1}{2\pi\sigma^2} \cdot e^{-\frac{x^2+y^2}{2\sigma^2}} \]
当给定维度(或两者)的输入内核支持大小为 0 时,它会根据给定的标准差计算得出,假设 \(\pm3\sigma\) 窗口之外的权重为零。
在这种情况下,使用以下公式
\[ w = \max\{3,2 \times \lceil 3\sigma\rceil-1\} \]
- 注意
- 我们将最小内核大小钳制为 3,因为大小为 1 的内核没有足够的样本来正确表征高斯函数。
C API 函数
有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档
用法
语言
- 导入 VPI 模块
- 使用 CPU 后端,使用 ZERO 边界条件,用 7x7 高斯内核和 \(\sigma=1.7\) 过滤输入图像。输入和输出均为 VPI 图像。
with vpi.Backend.CPU
output = input.gaussian_filter(7, 1.7, 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)
创建流实例。
- 处理阶段
- 将算法连同其他参数一起提交到流。它将由 CPU 后端执行。 它定义了一个在水平和垂直方向上都具有 7x7 支持和 \(\sigma=1.7\) 的高斯滤波器,以及零边界扩展。
VPIStatus vpiSubmitGaussianFilter(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, int32_t kernelSizeX, int32_t kernelSizeY, float sigmaX, float sigmaY, VPIBorderExtension border)
对图像运行 2D 高斯滤波器。
@ VPI_BORDER_ZERO
图像外部的所有像素都被视为零。
- (可选)等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻止调用线程,直到此流队列中的所有提交命令都完成(队列为空)。
- 清理阶段
- 释放流以及输入和输出图像所持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关更多信息,请参阅VPI - 视觉编程接口的“C API 参考”部分中的高斯滤波器。
性能
有关如何使用以下性能表的信息,请参阅算法性能表。
在比较测量结果之前,请查阅比较算法运行时间。
有关性能基准测试方式的更多信息,请参阅性能基准。
-