移动均值滤波与中值滤波

引言

基于MATLAB,使用中值滤波与均值滤波器进行滤波操作简单。原理也easy理解。

好理解,也仅仅针对于数据处在中间部分能够正好能够取到一个完整窗体,可是当数据恰巧在两端时。怎样计算均值或者中值确是值得思考的问题。

均值滤波

均值滤波也称线性滤波。主要思想为邻域平均法,即用邻域的几个信号的平均值来取代对应位置的原值。

MATLAB中均值滤波仅仅须要调用函数smooth(y,span),当中y待滤波信号。span为跨度。既窗体大小。举例说明均值滤波原理。尤其是在信号边缘处。从以下式子能够明确在边缘处均值滤波器是怎样工作的。中值滤波器在边缘的处理能够说要复杂一些,在下一节中具体介绍。

MATLAB均值滤波器默认窗体大小是3。以下式子以窗体大小为5进行说明。

yy(1) = y(1)
yy(2) = (y(1) + y(2) + y(3))/3
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
...

中值滤波器

中值滤波器是一种非线性数字滤波技术,通经常使用于去除图像或信号中的噪声。中值滤波器基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个信号为中心点的邻域,一般为方形邻域(窗体),对于二维数据也能够为圆形、十字形等等,然后将邻域中各信号值排序。取当中间值(中值)作为中心信号的新值,这里邻域被称为窗体。当窗体移动时。利用中值滤波能够对信号进行平滑处理。

MATLAB中中值滤波器滤波函数为y=medfilt1(x,n),当中x是待滤波的原始信号,n为窗体大小。MATLAB的中值滤波原理为:

n为奇数时, y(k)x(k(n1)/2:k+(n1)/2)的中值;
n为偶数时, y(k)x(kn/2:k+(n/2)1)的中值;
medfilt1函数将对这个链表进行排序。对中间的两个值取平均作为中值滤波结果。

当n为偶数时,上面链表中数据个数为偶数,中间值有两个,中值结果为中间两个值的均值。
例1: 若 n=11,y(k)x(k5:k+5)的中值。
例1: 若 n=12,y(k)x(k6:k+5)

问题来了,当k处于信号边缘处。该怎样取中值呢?
MATLAB的方法是。在边缘处,无法取到窗体宽度情况下用0填充到序列为窗体窗体宽度,然后取中值。举例说明:
对序列,使用medfilt1(x,n)进行中值滤波,窗体n=5


中值滤波前:

-7.9454   -5.8673   -7.2306   -6.7342   -7.9865   -6.3642   -5.8256   -7.3029

中值滤波后:

-5.8673   -6.7342   -7.2306   -6.7342   -6.7342   -6.7342   -6.3642   -5.8256

对于边缘信号第1个元素的中值滤波结果-5.8673=median(0 0 -7.9454 -5.8673 -7.2306),median为取中值函数。
对于边缘信号第2个元素的中值滤波结果-6.7342=median(0 -7.9454 -5.8673 -7.2306 -6.7342)。
·······
对于边缘第8个元素的中值滤波结果-5.8256=median(-6.3642 -5.8256 -7.3029 0 0)。

採用这个过程进行中值滤波方法在边缘处会产生比較大的失真情况出现。在维基百科wiki中提供了第二种解决思路可供參考。以下是wiki提供的中值滤波方法,在边缘也进行了填充,可是是通过填充边缘值而不是MATLAB中填充0。
x是信号,y是新产生的信号。

x = [2 80 6 3]

y[1] = Median[2 2 80] = 2
y[2] = Median[2 80 6] = Median[2 6 80] = 6
y[3] = Median[80 6 3] = Median[3 6 80] = 6
y[4] = Median[6 3 3] = Median[3 3 6] = 3

y = [2 6 6 3].

依据MATLAB中中值滤波原理代码实现

%% ymm 为滤波后结果。y是一维原始信号
n = 11 %这是窗体
if rem(n,2)==1
    right = (n-1)/2;
    left = (n-1)/2;
else
    right = n/2-1;
    left = n/2;
end
ymm = [];
for i = 1:l
    u = i+right;
    d = i-left;

    if d<1
        ymm =[ymm median([zeros(1,1-d) y(1:u)])];
    elseif d>=1&u<=l
        ymm =[ymm median(y(d:u))];
    elseif u>l
        ymm =[ymm median([y(d:l) zeros(1,u-l)])];
    end
end

通过上面的代码,将中值滤波改动为wiki中的边缘中值计算方法

n = 11
if rem(n,2)==1
    right = (n-1)/2;
    left = (n-1)/2;
else
    right = n/2-1;
    left = n/2;
end
ymm = [];
for i = 1:l
    u = i+right;
    d = i-left;

    if d<1
        zero = zeros(1,1-d);
        zero(:) = y(1);
        ymm =[ymm median([zero y(1:u)])];
    elseif d>=1&u<=l
        ymm =[ymm median(y(d:u))];
    elseif u>l
        zero = zeros(1,u-l);
        zero(:) = y(l);
        ymm =[ymm median([y(d:l) zero])];
    end
end

下图中。黑色曲线是原始信号真实值,绿色曲线是加入了高斯白噪声后的信号,蓝色和红色各自是均值和中值滤波效果。


下图中是MATLAB中的均值和中值滤波方法。在边缘处(两端),中值滤波结果有明显的失真现象。
这样的边缘处理方式将非常好的保留边缘值。



这里写图片描写叙述

这里写图片描写叙述

这里写图片描写叙述

以下两幅图各自是wiki中提供的中值滤波的两端(边缘处)滤波失真情况减弱的效果。
红色是MATLAB提供的中值滤波方法滤波结果。在边缘处失真严重。

青色为上面代码依据wiki的中值滤波方法,在边缘处与均值滤波效果一致。


这里写图片描写叙述

这里写图片描写叙述

參考

[1]https://en.wikipedia.org/wiki/Median_filter
[2]http://blog.sina.com.cn/s/blog_40a27f6a0101nq9x.html
[3]http://cn.mathworks.com/help/curvefit/smooth.html?

searchHighlight=smooth&s_tid=doc_srchtitle
[4]http://cn.mathworks.com/help/signal/ref/medfilt1.html?searchHighlight=medfilt1&s_tid=doc_srchtitle

【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/llguanli/p/8659887.html