python中值滤波

中值滤波

排序滤波中最常用的就是中值滤波,简单来说,就是给一个滤波范围,然后找到这个范围中的中位数,重新赋值给当前值。

例如,[1,3,2,4]这个数组,给定一个长度为3的滤波窗口,那么元素3所在位置的滤波范围就是1,3,2这三个数,这三个数的中位数是2,所以要把3更改为2。

import numpy as np
import scipy.signal as ss
x = np.arange(15)
x = [1,3,2,4]
ss.medfilt(x,3)
# array([1, 2, 3, 2])

二维中值滤波

二维的中值滤波在图像处理中非常常见,对椒盐噪声有着非常霸道的效果。

import matplotlib.pyplot as plt
img = plt.imread('img.jpg').astype(float)/255
rand = np.random.rand(*img.shape)
rand = rand * (rand > 0.9)
img += rand

fig = plt.figure("medfilt2")
ax = fig.add_subplot(1,2,1)
ax.imshow(img)
ax = fig.add_subplot(1,2,2)
img1 = img + 0  #深拷贝
for i in range(3):
    img1[:,:,i] = ss.medfilt2d(img1[:,:,i], [3,3])

ax.imshow(img1)
plt.show()

在这里插入图片描述
(上面这个图是我在搜lena图的时候出来的,虽然不是我认识的那个lena,但感觉用来做图像处理也不错,不知道这个算不算lena二代)

排序滤波

中值滤波要做的第一件事,就是对滤波窗口中的数据排序,然后才能找到中位数。但从另一个角度来看,仅仅认为中位数是有效值,貌似并不公平,所以scipy提供了更加高级的排序滤波函数order_filter

其输入参数除了待滤波函数之外,还包括一个滤波窗口以及保留值的大小次序。

from scipy import signal
x = np.arange(25).reshape(5, 5)
domain = np.identity(3)

则x值为

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ] \begin{bmatrix} 0& 1& 2& 3& 4\\ 5& 6& 7& 8& 9\\ 10& 11& 12& 13& 14\\ 15& 16& 17& 18& 19\\ 20& 21& 22& 23& 24\\ \end{bmatrix} 0510152016111621271217223813182349141924

在进行排序滤波后

signal.order_filter(x, domain, 0)
'''
array([[  0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   1.,   2.,   0.],
       [  0.,   5.,   6.,   7.,   0.],
       [  0.,  10.,  11.,  12.,   0.],
       [  0.,   0.,   0.,   0.,   0.]])
'''
signal.order_filter(x, domain, 2)
'''
array([[  6.,   7.,   8.,   9.,   4.],
       [ 11.,  12.,  13.,  14.,   9.],
       [ 16.,  17.,  18.,  19.,  14.],
       [ 21.,  22.,  23.,  24.,  19.],
       [ 20.,  21.,  22.,  23.,  24.]])
'''

其中,domain是一个单位阵,order_filter(x, domain, 0)表示选出对角阵所对应元素中排名第0的元素,也就是最小值;order_filter(x, domain, 2)选择的是排名第2的元素,也就是最大值。

就实际情况来看,domain覆盖的第一个子阵中,以0为中心,则只能覆盖到2x2的范围,其对角元素为0,6,最小值是0,最大值是6。如以6为中心,则可以完全覆盖3x3的内容,最小值为0,最大值为12。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微小冷

请我喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值