中值滤波(Median Filter)
中值滤波的中心思想就是逐项地遍历信号,并用相邻信号项的中值替换当前值。这种方法是的滤波处理非常快速,而且对于一维数据集合和二维数据集合(例如图像)都适用。
在下面的例子中,我们使用SciPy
信号 工具箱中的实现。
#! /usr/bin/python3.4
# _*_ encode:utf-8_*_
import numpy as np
import pylab as p
import scipy.signal as signal
# get some linear data
x = np.linspace(0,3,101)
print('Without noisy:',x)
# add some noisy signal
x[5::10] = 1.5
print('With noisy:',x)
p.plot(x)
p.plot(signal.medfilt(x,3))
p.plot(signal.medfilt(x,5))
p.legend(['original signal', 'length 3', 'length 5'])
p.show()
运行文本输出结果如下:
Without noisy: [ 0. 0.03 0.06 0.09 0.12 0.15 0.18 0.21 0.24 0.27 0.3 0.33
0.36 0.39 0.42 0.45 0.48 0.51 0.54 0.57 0.6 0.63 0.66 0.69
0.72 0.75 0.78 0.81 0.84 0.87 0.9 0.93 0.96 0.99 1.02 1.05
1.08 1.11 1.14 1.17 1.2 1.23 1.26 1.29 1.32 1.35 1.38 1.41
1.44 1.47 1.5 1.53 1.56 1.59 1.62 1.65 1.68 1.71 1.74 1.77
1.8 1.83 1.86 1.89 1.92 1.95 1.98 2.01 2.04 2.07 2.1 2.13
2.16 2.19 2.22 2.25 2.28 2.31 2.34 2.37 2.4 2.43 2.46 2.49
2.52 2.55 2.58 2.61 2.64 2.67 2.7 2.73 2.76 2.79 2.82 2.85
2.88 2.91 2.94 2.97 3. ]
With noisy: [ 0. 0.03 0.06 0.09 0.12 1.5 0.18 0.21 0.24 0.27 0.3 0.33
0.36 0.39 0.42 1.5 0.48 0.51 0.54 0.57 0.6 0.63 0.66 0.69
0.72 1.5 0.78 0.81 0.84 0.87 0.9 0.93 0.96 0.99 1.02 1.5
1.08 1.11 1.14 1.17 1.2 1.23 1.26 1.29 1.32 1.5 1.38 1.41
1.44 1.47 1.5 1.53 1.56 1.59 1.62 1.5 1.68 1.71 1.74 1.77
1.8 1.83 1.86 1.89 1.92 1.5 1.98 2.01 2.04 2.07 2.1 2.13
2.16 2.19 2.22 1.5 2.28 2.31 2.34 2.37 2.4 2.43 2.46 2.49
2.52 1.5 2.58 2.61 2.64 2.67 2.7 2.73 2.76 2.79 2.82 1.5
2.88 2.91 2.94 2.97 3. ]
中值滤波,窗口长度为3和5:
从图形中可以看出,窗口越大,信号和原始信号相比失真越严重,但同时看上去也越平滑。