中值滤波scipy.signal.medfilt()方法

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中位数代替 。与邻域平均法类似,但计算的是中值。

用scipy.signal.medfilt()实现中值滤波

函数原型:

scipy.signal.medfilt(volume, kernel_size=None)

参数:

  • volume: N维输入数组。
  • kernel_size: 一个标量或元组,代表每个维度中中值滤波窗口的大小(即取多少个值的中值),默认值为3。

中值滤波技术能有效抑制噪声,通过把数字图像中一点的值用该点周围的各点值的中位数来代替,让这些值接近,以消除原数据(图像or时序数据)中的噪声。

signal的medfilt()方法传入一个参数:

import random
import numpy as np
import scipy.signal as signal
x=np.arange(0,100,10)
random.shuffle(x)
pint(x)
x = signal.medfilt(x,3) #一维中值滤波
pint(x)
"""
输出:array([60, 40, 70,  0, 50, 30, 90, 80, 10, 20])
      array([40., 60., 40., 50., 30., 50., 80., 80., 20., 10.])
"""

在这里插入图片描述
signal的medfilt()方法传入两个参数:第一个参数是要作中值滤波的信号,第二个参数是邻域的大小(奇数)。如邻域为3即是每个点自己和上下左右各一个点(共9个点)成为一个邻域。在每个位置的邻域中选取中位数替换这个位置的数。如果邻域中出现没有元素的位置,那么以0补齐。

x = np.random.randint(1,1000,(4,4))
print(x,"\n")
x = signal.medfilt(x,(3,3)) #二维中值滤波
print(x)
"""
输出:
[[ 14 442 710 256]
 [839 102 372 937]
 [ 70 638 506 684]
 [118 769 608 666]]

[[  0. 102. 256.   0.]
 [ 70. 442. 506. 372.]
 [102. 506. 638. 506.]
 [  0. 118. 608.   0.]]
"""

在这里插入图片描述

中值滤波在时序数据上的效果

import scipy.signal as signal
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

n = 50 
y = np.sin(np.linspace(0, 10, n)) + np.random.rand(n)
y_med = signal.medfilt(y, kernel_size=5)

plt.figure()
plt.plot(y, 'r--', label='y')
plt.plot(y_med, 'b-.', label='y_med')
plt.legend()
plt.show()

可以看出经中值滤波处理后的数据(蓝色线)相对原数据(红色线)较平滑了许多
在这里插入图片描述

中值滤波在图像上的应用效果

import cv2
import numpy as np
url="test.png"
img=cv2.imread(url)

# 加上椒盐噪声
# 灰阶范围
w=img.shape[1]
h=img.shape[0]
newimg=np.array(img)

# 噪声点数量
noisecount=5000
for k in range(0,noisecount):
    xi=int(np.random.uniform(0,newimg.shape[1]))
    xj=int(np.random.uniform(0,newimg.shape[0]))
    newimg[xj,xi]=255

# 中值滤波去噪(平滑图片)
lbimg=cv2.medianBlur(newimg,3)
cv2.imshow('lbimg',lbimg)
# 添加了噪音的图片
cv2.imshow('newimg',newimg)

cv2.waitKey()
cv2.destroyAllWindows()     

在这里插入图片描述

### 如何在 Python 中对一维信号进行中值滤波处理 对于在一维信号上执行中值滤波的任务,`scipy.signal.medfilt` 是一种常用方法。此函数可以应用于一维或多维数组,在指定窗口内计算中位数值来替代中心位置的原始值从而达到平滑效果的目的。 需要注意的是,当使用 `medfilt` 函数时,输入的一维数组不应被显式地转换成列向量形式(即形状为 (N, 1) 的二维数组),而应该保持其作为扁平化的一维结构(长度 N)。这是因为 SciPy 库中的某些版本可能无法正确处理具有特定维度布局的数据[^1]。 下面是一个简单的例子展示如何利用 `scipy.signal.medfilt` 对一维噪声信号实施中值滤波: ```python import numpy as np from scipy import signal import matplotlib.pyplot as plt # 创建带随机噪音的一维测试信号 np.random.seed(0) t = np.linspace(0, 1, 200, endpoint=False) sig = np.sin(2 * np.pi * t) noise = np.random.normal(.5, .5, sig.shape) noisy_sig = sig + noise # 定义并应用中值滤波器 filtered_signal = signal.medfilt(noisy_sig, kernel_size=9) # 绘制原图与过滤后的对比图像 plt.figure(figsize=(8, 6)) plt.plot(t, noisy_sig, label='Noisy Signal') plt.plot(t, filtered_signal, linewidth=3, label='Filtered Signal') plt.legend() plt.show() ``` 这段代码首先构建了一个带有高斯白噪声污染的理想正弦曲线样本;接着通过调用 `signal.medfilt()` 方法对该受扰动的时间序列进行了中值滤波操作,并指定了核大小为 9 来控制局部邻域范围内的统计特性估计过程;最后借助 Matplotlib 展示了未经处理以及经过滤波净化之后的结果比较图表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值