引言:在处理图像时,线性滤波将破坏边缘,而且不能有效滤除脉冲噪声。非线性滤波基于对输入信号序列的一种非线性映射关系,常可把某一特定的噪声近似映射为零而保留信号的重要特征,因而可以在一定程度上克服线性滤波的不足。浅谈中值滤波
中值滤波
1.原理
设有一个序列:x1,x2,x3,x4,x5,将它们按照绝对值大小重新排列此序列x3,x5,x2,x4、x1,重排以后的中值是×2,此值就作为滤波的输出。
2.Matlab代码实现
function g = median_filter(f)
[height, width]= size(f); % 输入图像的大小
g = zeros(height, width); % 为输出图像分配内存
for y = 1:height
for x = 1:width
x1 = x - 2; % 5x5 窗口的左列
x2 = x + 2; % 5x5 窗口的右列
y1 = y - 2; % 5x5窗口的顶行
y2 = y + 2; % 5x5窗口的底行
% 当邻域超出图像边界时,舍去超过边界的领域
x1 = max(x1, 1);
x2 = min(x2, width);
y1 = max(y1, 1);
y2 = min(y2, height);
window = f(y1:y2, x1:x2); % 5 x 5窗口
window = window(:); % 将窗口重新排列为列向量
g(y, x) = median(window); % 输出像素=窗口的中值
end
end
g = uint8(g); imshow(g); % 转换为8位图像并显示
中心加权中值滤波(the center weighted median filter)
1.原理
先解释一下加权中值滤波:
设有三个数(3,3,9),中位数为3,若加权系数为(1,1,3),即X3的加权系数W3=3,X1和X2的加权系数分别为W1和W2=1,也就是相当于X1重复1次,X2重复1次,X3重复3次,即相当于有5个数(3,3,9,9,9),中位数为9。一般中值滤波则相当于权系数为(1,1,1)。
而中心加权中值滤波:
就是对中心值加权(重复)
设有三个数(3,6,9),中位数为6,若中心加权系数为3,即X2的权系数W2=3,也就是相当于X2重复2次即相当于有5个数(3,6,6,6,9),中位数为6。一般中值滤波则相当于权系数为(1,1,1)。
2.Matlab代码实现
function g = cw_median_filter(f, M)
[height, width]= size(f);
g = zeros(height, width);
for y = 1:height
for x = 1:width
x1 = x - 2;
x2 = x + 2;
y1 = y - 2;
y2 = y + 2;
x1 = max(x1, 1);
x2 = min(x2, width);
y1 = max(y1, 1);
y2 = min(y2, height);
window = f(y1:y2, x1:x2);
window = window(:);
window1=[window;repmat(f(y,x),M-1,1)]; %M-1的原因是,window本身就包含了f(y,x) ,当M=1时就是中值滤波
g(y, x) = median(window1);
end
end
g = uint8(g);