中值滤波的实现步骤
首先,选择一个窗口大小(通常为奇数),然后将这个窗口在信号或图像上逐个滑动。对于每个窗口,取其中的所有数值,按大小排序,并选择排序后的中间值(即中值)来替代窗口中心的值。窗口滑动后重复此过程,直到处理完所有数据点或像素。这样可以有效去除尖峰噪声,同时保留数据的主要趋势和边缘特征。
举例:
假设我们有一个包含噪声的信号序列,长度为 9,噪声是一个极端值(如 100):
原始信号: [1, 2, 3, 100, 5, 6, 7, 8, 9]
现在我们使用一个窗口大小为 3 的中值滤波器来处理这个信号。也就是说,我们每次取当前值及其前后各一个值,共 3 个值,取其中的中值来替代当前值。
中值滤波的过程
-
处理第一个数 1:
- 窗口内的数字:
[1, 2]
(因为前面没有更多的数字) - 排序后:
[1, 2]
- 中值:
1
- 替换后的值:
1
- 窗口内的数字:
-
处理第二个数 2:
- 窗口内的数字:
[1, 2, 3]
- 排序后:
[1, 2, 3]
- 中值:
2
- 替换后的值:
2
- 窗口内的数字:
-
处理第三个数 3:
- 窗口内的数字:
[2, 3, 100]
- 排序后:
[2, 3, 100]
- 中值:
3
- 替换后的值:
3
- 窗口内的数字:
-
处理第四个数 100(这是个噪声点):
- 窗口内的数字:
[3, 100, 5]
- 排序后:
[3, 5, 100]
- 中值:
5
- 替换后的值:
5
- 窗口内的数字:
-
处理第五个数 5:
- 窗口内的数字:
[100, 5, 6]
- 排序后:
[5, 6, 100]
- 中值:
6
- 替换后的值:
6
- 窗口内的数字:
-
处理第六个数 6:
- 窗口内的数字:
[5, 6, 7]
- 排序后:
[5, 6, 7]
- 中值:
6
- 替换后的值:
6
- 窗口内的数字:
-
处理第七个数 7:
- 窗口内的数字:
[6, 7, 8]
- 排序后:
[6, 7, 8]
- 中值:
7
- 替换后的值:
7
- 窗口内的数字:
-
处理第八个数 8:
- 窗口内的数字:
[7, 8, 9]
- 排序后:
[7, 8, 9]
- 中值:
8
- 替换后的值:
8
- 窗口内的数字:
-
处理第九个数 9:
- 窗口内的数字:
[8, 9]
(因为后面没有更多的数字) - 排序后:
[8, 9]
- 中值:
9
- 替换后的值:
9
- 窗口内的数字:
滤波后的信号
将所有的替换值组合起来,得到滤波后的信号:
滤波后的信号: [1, 2, 3, 5, 6, 6, 7, 8, 9]
结果分析
可以看到,原始信号中的噪声点 100
被替换成了 5
,有效地去除了噪声。除此之外,信号的其他部分保持了很好的平滑,信号的主要趋势没有被破坏。
这就是中值滤波的基本原理和应用,它可以有效去除尖峰噪声,同时保留信号的主要特征。