均值滤波、中值滤波【MATLAB】【图像处理】

版权声明:转载请先联系并注明出处! https://blog.csdn.net/u010552731/article/details/48162719

1. 均值滤波:即线性滤波,有:  a.邻域平均, b. 加权平均两种。

a. 邻域平均:用一个像素邻域平均值作为滤波结果,此时滤波器模板的所系数都取1,为保证输出图仍在原来的灰度值范围,在算得R后要将其除以系数总个数再进行赋值,对3*3的模板来说,在算得R后要将其除以系数9。

b. 加权平均:对同一尺寸的模板,可对不同位置的系数采用不同的数值,一般认为离对应模板中心像素近的像素应对滤波结果又较大贡献,所以接近模板中心的系数可比较大而模板边界附近的系数应比较小。

以3*3模板为例:

f = imread('F:\matlab_ex\imageProcessing\wx.jpg');
n = 3;
template = ones(n);
[height, width] = size(f);
x1 = double(f);
x2 = x1;
for i = 1:height-n+1
    for j = 1:width-n+1
        c = x1(i:i+n-1,j:j+n-1).*template;
        s = sum(sum(c));
        x2(i+(n-1)/2,j+(n-1)/2) = s/(n*n);
    end
end

g = uint8(x2);
imshow(g);


2. 中值滤波:是一种非线性滤波方式,也靠模板来实现。首先确定一个以某个像素为中心的邻域,一般为方形邻域,也可为圆形、十字形等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值。

f = imread('F:\matlab_ex\imageProcessing\wx.jpg');
[height, width] = size(f);
x1 = double(f);
x2 = x1;
for i = 1:height-n+1
    for j = 1:width-n+1
        c = x1(i:i+n-1,j:j+n-1);
        e = c(1,:);
        for k = 2:n
            e = [e, c(k, :)];
        end
        tmp = median(e);
        x2(i+(n-1)/2,j+(n-1)/2) = tmp;
    end
end

g = uint8(x2);
imshow(g);

3. 使用自带函数滤波

try
%实验步骤一:彩色、灰度变换
h=imread('<span style="font-family: Arial, Helvetica, sans-serif;">F:\matlab_ex\imageProcessing\wx.jpg</span><span style="font-family: Arial, Helvetica, sans-serif;">'); %读入彩色图片</span>
c=rgb2gray(h); %把彩色图片转化成灰度图片,256级
figure,imshow(c),title('原始图象'); %显示原始图象
g=imnoise(c,'gaussian',0.1,0.002); %加入高斯噪声
figure,imshow(g),title('加入高斯噪声之后的图象'); %显示加入高斯噪声之后的图象

%实验步骤二:用系统预定义滤波器进行均值滤波
n=input('请输入均值滤波器模板大小\n');
A=fspecial('average',n); %生成系统预定义的3X3滤波器
Y=filter2(A,g)/255;           %用生成的滤波器进行滤波,并归一化
figure,imshow(Y),title('用系统函数进行均值滤波后的结果'); %显示滤波后的图象

%实验步骤三:用Matlab系统函数进行中值滤波
n2=input('请输入中值滤波的模板的大小\n');
Y3=medfilt2(g,[n2 n2]);   %调用系统函数进行中值滤波,n2为模板大小 
figure,imshow(Y3),title('用Matlab系统函数进行中值滤波之后的结果'); %显示滤波后的图象

%实验步骤四:用matlab系统函数进行高斯滤波
n3=input('请输入高斯滤波器的均值\n');
k=input('请输入高斯滤波器的方差\n');
A2=fspecial('gaussian',k,n3);      %生成高斯序列
Y5=filter2(A2,g)/255;              %用生成的高斯序列进行滤波
figure,imshow(Y5),title('用Matlab函数进行高斯滤波之后的结果');    %显示滤波后的图象

catch           %捕获异常
    disp(lasterr);     %如果程序有异常,输出
end

One more thing

准备把这几年的学习笔记和一些电子书逐渐上线到微信公众号,欢迎关注,一起成为大佬~


以上

猜你喜欢

转载自blog.csdn.net/u010552731/article/details/48162719