概述
中值滤波算法使用提供的 2D 核对输入图像执行二维 (2D) 滤波操作。核定义了滤波操作的像素邻域。滤波器执行非线性操作,其中正在处理的像素被输入图像中被核掩蔽的像素集中值替换。中值滤波操作用于脉冲噪声降低、图像平滑、分析等。
输入 | 核 | 输出 |
| \[ \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} \]
| |
实现
VPI 以以下方式实现中值滤波
离散 2D 中值滤波使用以下离散函数实现
\[ I'[x,y] = \underset{m \in [0 .. k_h-1] \\ n \in [0 .. k_w-1]}{median} \Big\{ K[m,n] \times I[x-(n-\lfloor k_w/2 \rfloor), y-(m-\lfloor k_h/2 \rfloor)] \Big\} \]
其中
- \(I\) 是输入图像。
- \(I'\) 是结果图像。
- \(K\) 是邻域核,其中 \(K \in \{0 \vee 1\}\)。
- \(k_w, k_h\) 分别是核的宽度和高度。
- \(median\) 是中值滤波操作。
C API 函数
有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档
用法
语言
- 导入 VPI 模块
- 定义一个 3x3 形态学核以执行完整邻域搜索。
kernel = [[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]
- 使用 CPU 后端和给定的核对输入图像运行中值滤波。输入和输出是 VPI 图像。
with vpi.Backend.CUDA
output = input.median_filter(kernel, 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)
创建流实例。
- 处理阶段
- 定义要使用的核。在本例中,一个简单的 3x3 全邻域。
int8_t kernel[3 * 3] = { 1, 1, 1,
1, 1, 1,
1, 1, 1 };
- 提交用于中值滤波的算法。选择的边界扩展是 VPI_BORDER_LIMITED,因为它忽略图像外部的所有像素。它将由 CPU 后端执行。
@ VPI_BORDER_LIMITED
将图像视为受限,不访问外部像素。
- 可选地,等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中所有提交的命令都完成(队列为空)。
- 清理阶段
- 释放流以及输入和输出图像所持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关更多信息,请参阅 VPI - Vision Programming Interface 的“API 参考”部分中的 中值滤波。
性能
有关如何使用下面的性能表的信息,请参阅 算法性能表。
在比较测量结果之前,请查阅 比较算法运行时间。
有关性能基准测试方式的更多信息,请参阅 性能基准。
-