python中值滤波实现(有填充和无填充)

1、中值滤波简介
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为33,55区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
2、定义:
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。

中值滤波方法:对一个数字信号序列xj(-∞<j<∞)进行滤波处理时,首先要定义一个长度为奇数的L长窗口,L=2N+1,N为正整数。设在某一个时刻,窗口内的信号样本为x(i-N),…,x(i),…,x(i+N),其中x(i)为位于窗口中心的信号样本值。对这L个信号样本值按从小到大的顺序排列后,其中值,在i处的样值,便定义为中值滤波的输出值,写为如图1.

中值滤波是在"最小绝对误差"准则下的最优滤波。

在实际应用中,随着所选用窗口长度的增加,滤波的计算量将会迅速增加。因此,寻求中值滤波的快速算法,是中值滤波理论的一个重要研究内容。中值滤波的快速算法,一般采用下述三种方式:①直方图数据修正法;②样本值二进制表示逻辑判断法;③数字和模拟的选择网络法。

对中值滤波的理论研究,还集中于统计特性分析和根序列的描述方面。当一个信号序列经一特定窗口长度的中值滤波反复处理后,它会收敛于某一个不再变化的序列,这个序列称为中值滤波的根序列。根序列是描述中值滤波特性的一个重要概念。通过对根序列结构的研究,可以确定原信号序列中,哪些成分可以经中值滤波后保留下来,哪些成分将被抑制。这对确定中值滤波器的窗口长度,提供了重要依据。用VLSI实现的中值滤波器芯片,可供实时处理中应用。
3、实现方法
1:通过从图像中的某个采样窗口取出奇数个数据进行排序

2:用排序后的中值取代要处理的数据即可
4、应用
中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大.

中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。
5、代码实现
(1)有填充
import numpy as np
from imageio import imread
from scipy.misc import imsave, imresize
import matplotlib.pyplot as plt
from PIL import Image
#中值滤波
def MedianFilter(src,k=21):
imarray = np.copy(src) #读取图像副本
height, width,C = imarray.shape#读取图像数据形状大小
edge = int((k - 1) / 2) # 根据模板计算填充
new_arr = np.zeros((height + edge * 2, width + edge * 2, C), dtype=np.float)
new_arr[edge: edge + height, edge: edge + width] = src.copy().astype(np.float)
for i in range(height):
for j in range(width):
for c in range©:
#查找中值,用中值替换原来的像素返回原位置
new_arr[i+edge, j+edge,c] = np.median(imarray[i:i + k, j :j + k,c])

new_arr = new_arr[edge: edge + height, edge: edge + width].astype(np.uint8)
new_im = Image.fromarray(new_arr)

return(new_im)

if name == “main”:
input_images = np.zeros((300, 300))
im = imread(‘E:\mmn\ssz.jpg’)
plt.subplot(121)
plt.imshow(im)
out_img = MedianFilter(im)
plt.subplot(122)
plt.imshow(out_img)
plt.show()
在这里插入图片描述

(2)无填充
import numpy as np
from imageio import imread
from scipy.misc import imsave, imresize
import matplotlib.pyplot as plt
from PIL import Image
#中值滤波
def MedianFilter(src,k=21, padding=None):
imarray = np.copy(src) #读取图像副本
height, width,C = imarray.shape#读取图像数据形状大小
if not padding: #无填充方式
edge = int((k - 1) / 2) #根据模板计算出边缘
if height - 1 - edge <= edge or width - 1 - edge <= edge :#判断模板是否可用
print(“The parameter k is to large.”)
return None
new_arr = np.zeros((height, width,C), dtype=np.uint8)#初始化
for i in range(height):
for j in range(width):
for c in range©:
if i <= edge-1 or i >= height - 1 - edge or j <= edge-1 or j >= width - edge - 1:
new_arr[i, j,c] = imarray[i, j,c] #判断像素位置是否是边缘位置如果是返回原像素到原来的位置
else:
#查找中值,用中值替换原来的像素返回原位置
new_arr[i, j,c] = np.median(imarray[i-edge:i + edge-1, j -edge:j + edge-1,c])
new_im = Image.fromarray(new_arr)

    return(new_im)

if name == “main”:
input_images = np.zeros((300, 300))
im = imread(‘E:\mmn\ssz.jpg’)
plt.subplot(121)
plt.imshow(im)
out_img = MedianFilter(im)
plt.subplot(122)
plt.imshow(out_img)
plt.show()
在这里插入图片描述

关于中值滤波的简介部分摘抄自:https://editor.csdn.net/md?articleId=107591477

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值