python 数据、曲线平滑处理——Savitzky-Golay 滤波器
·
简介
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
Savitzky-Golay 滤波器–调用讲解
对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。
python中Savitzky-Golay滤波器调用如下:
y_smooth = scipy.signal.savgol_filter(y,53,3)
# 亦或
y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')
# 备注:
y:代表曲线点坐标(x,y)中的y值数组
window_length:窗口长度,该值需为正奇整数。例如:此处取值53
k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied. )
调参规律:
现在看一下window_length和k这两个值对曲线的影响。
-
window_length对曲线的平滑作用:
( window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。 -
k值对曲线的平滑作用:
( k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。
代码示例
# 用于生成问题描述中示例曲线的代码如下:
import numpy as np
from matplotlib import pyplot as plt
Size = 100
x = np.linspace(1, Size,Size)
#生成随机矩阵
data = np.random.randint(1, Size, Size)
print(data)
# 可视化图线
plt.plot(x, data,'r')
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
y = savgol_filter(data, 15, 2, mode= 'nearest')
# 可视化图线
plt.plot(x, y, 'b', label = 'savgol')
#显示曲线
plt.show()
参考:
https://blog.csdn.net/m0_51233386/article/details/129866795
https://blog.csdn.net/hjgjy/article/details/115873386
更多推荐

所有评论(0)