移动均值滤波与中值滤波
引言
基于MATLAB,使用中值滤波与均值滤波器进行滤波操作简单。原理也easy理解。
好理解,也仅仅针对于数据处在中间部分能够正好能够取到一个完整窗体,可是当数据恰巧在两端时。怎样计算均值或者中值确是值得思考的问题。
均值滤波
均值滤波也称线性滤波。主要思想为邻域平均法,即用邻域的几个信号的平均值来取代对应位置的原值。
MATLAB中均值滤波仅仅须要调用函数
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中中值滤波器滤波函数为
当
当
当n为偶数时,上面链表中数据个数为偶数,中间值有两个,中值结果为中间两个值的均值。
例1: 若
例1: 若
问题来了,当
MATLAB的方法是。在边缘处,无法取到窗体宽度情况下用0填充到序列为窗体窗体宽度,然后取中值。举例说明:
对序列,使用
中值滤波前:
-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),
对于边缘信号第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 = [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