不同卷积不同的滤波效果
1. 代码
import numpy as np
import matplotlib.pyplot as plt# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans', 'Arial']
plt.rcParams['axes.unicode_minus'] = False# 原始数据
original_data = np.array([20, 22, 24, 25, 28, 27, 26])# 定义四种不同的卷积核
kernels = {"均值平滑": np.array([0.33, 0.33, 0.34]), # 近似平均"高斯平滑": np.array([0.25, 0.5, 0.25]), # 高斯权重"边缘检测": np.array([-1, 0, 1]), # 检测变化"自定义加权": np.array([0.5, 0.8, 0.5]) # 您提供的卷积核
}# 应用不同卷积核并计算结果
results = {}
padded_data_list = {} # 存储填充后的数据for name, kernel in kernels.items():# 手动实现填充(两端各填充一个0)padded_data = np.pad(original_data, (1, 1), mode='constant', constant_values=0)padded_data_list[name] = padded_data# 使用'valid'模式计算卷积result = np.convolve(padded_data, kernel, mode='valid')results[name] = result# 打印填充后的数据
print("原始数据:", original_data)
print("\n填充后的数据:")
for name, padded_data in padded_data_list.items():print(f"{name}核填充后: {padded_data}")# 打印卷积结果
print("\n不同卷积核处理结果:")
for name, result in results.items():print(f"{name}: {np.round(result, 2)}")# 创建图表
plt.figure(figsize=(14, 10))# 绘制原始数据
plt.subplot(3, 2, 1)
plt.plot(original_data, 'o-', linewidth=2, markersize=8)
plt.title("原始数据")
plt.grid(True)# 绘制各卷积核处理结果
for i, (name, result) in enumerate(results.items(), 2):plt.subplot(3, 2, i)plt.plot(result, 's-', linewidth=2, markersize=8)plt.title(f"{name}核处理结果")plt.grid(True)# 添加所有结果的对比图
plt.subplot(3, 2, 6)
plt.plot(original_data, 'o-', linewidth=2, markersize=8, label='原始数据')
for name, result in results.items():plt.plot(result, 's-', linewidth=2, markersize=6, label=f'{name}结果')
plt.title("所有处理结果对比")
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()
2. 效果