修正的阿尔法均值滤波
统计排序滤波器的响应基于由该滤波器包围的图像区域中的像素值的排序,为一种非线性滤波器。常用的非线性滤波器有中值滤波器、、自适应中值滤波、最大值(最小值)滤波器、中点滤波器与修正的阿尔法均值滤波器等。
修正的阿尔法均值滤波器类似于去掉最高分与去掉最低分评价一个选手水平的方法,即将滤波范围内的数据进行排序,从大到小的顺序去除d个数据,从小到大的顺序去除d个数据,将剩下的数据计算均值。这样的滤波器,很擅长去除椒盐噪声与其他类型噪声一起污染过的图片。
算法思路
1、图像预处理,包括格式转换等 2、添加噪声(本处为了对比中值滤波的效果,选择添加了椒盐噪声) 3、图像边缘填充,选择模板大小 4、抠出模板包含的子图像,进行排序之后选择前后删除的像素点 5、计算矩阵的阿尔法均值
Matlab代码
clc;
clear;
%读入图像,并转换为double型
I=imread('lena.jpg');
I=rgb2gray(I);
subplot(2, 2, 1), imshow(I)
img=im2double(I);
img=imnoise(img, 'salt & pepper', 0.05);
subplot(2, 2, 2), imshow(img)
[MM,NN]=size(img);
%定义子窗口的尺寸
m=3;
n=3;
%确定要扩展的行列数
len_m=floor(m/2);
len_n=floor(n/2);
%将原始图像进行扩展,这里采用了镜像扩展,以进行图像边缘计算
I_D_pad=padarray(img,[len_m,len_n],'symmetric');
%获得扩展后的图像尺寸
[M,N]=size(I_D_pad);
d=m*n-1;
J_Alpha=zeros(MM,NN);
%逐点计算子窗口的谐波平均
for i=1+len_m:M-len_m
for j=1+len_n:N-len_n
%从扩展图像中取出子图像
Block=I_D_pad(i-len_m:i+len_m,j-len_n:j+len_n);
Block=sort(Block(:));
Block=Block(floor(d/2+1):floor(m*n-4));
%计算矩阵的阿尔法均值
J_Alpha(i-len_m,j-len_n)=sum(sum(Block))/(m*n-d);
end
end
f2=medfilt2(img,[3,3]);
subplot(2, 2, 4), imshow(f2)
title('中值滤波');
subplot(2, 2, 3), imshow(J_Alpha)
title('修正后的阿尔法均值滤波器:d=8');
实验效果