中值滤波
1)算法说明
- 把测量值放在一个数组里,设置一个长度为 m m m 的小窗,令它在数组上滑动,对窗口内的值进行排序,用中间值替换原来的数据(窗口中间的原数据);
- 每次滑动一格,采样到一个新数据就将其放入窗尾,并扔掉原来队首的一次测量值(先进先出原则)。
图解(以窗口长度 m = 3 m=3 m=3 为例):

【Tips】 :重复元素并不影响中值的计算,只需要按照大小顺序排列后取中间位置的数即可。
2)边界处理
因为中值滤波的原理,原测量数组的前 ( m − 1 ) / 2 (m-1)/2 (m−1)/2 个元素,以及后 ( m − 1 ) / 2 (m-1)/2 (m−1)/2 个元素是得不到更新的。
- 可以先在原数组前填充 m − 1 m-1 m−1 个元素,那么所有的值都可得到更新。所填充的元素可以是原数组的第 2 2 2 至 第 m m m 个元素的镜像。
- 也可以是原数组前填充 ( m − 1 ) / 2 (m-1)/2 (m−1)/2 个元素,原数组后填充 ( m − 1 ) / 2 (m-1)/2 (m−1)/2 个元素,所填元素均是原数组头部和尾部的镜像(但不包括第一个和最后一个元素)。
3)代码
def median_filter(data, window_size):"""中位值滤波,使用镜像边缘填充:param data: 输入数据列表:param window_size: 滑动窗口大小(应为奇数):return: 滤波后的数据列表"""# 镜像开始部分,将data的第 2 至 window_size 个元素反方向排序,并填充进data的前面data_first = data[1 : window_size-1][::-1] # 1. 取data的第2个至第N+1个元素,赋予新数组data_newdata_new = data_first + data# 进行中值滤波filtered_data = []for i in range(len(data)):window = data_new[i:i + window_size]median = sorted(window)[window_size // 2]filtered_data.append(median)return filtered_data# 测试
if __name__ == "__main__":data = [1, 3, 2, 9, 4, 7, 6, 9, 8, 10, 12, 15, 10]window_size = 5result = median_filter(data, window_size)print(result)------------------------------------------------------------------------------------------------------------------
# 运行结果:
[3, 2, 3, 3, 4, 6, 7, 7, 8, 9, 10, 10, 12]
| 上一篇 | 下一篇 |
|---|---|
| 消抖滤波 | 待发布 |
