一、均值滤波
1、算术均值滤波器
算数均值滤波器即用周围灰度值的平均值代替滤波中心像素的灰度值,其表达式为:
其中m,n为滤波模板大小,f为需要处理的图像,g为滤波后的图像。
2、几何均值滤波器
几何滤波器与算数均值滤波器相比,丢失的图像细节较少,其表达式为:
实现代码:
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
I=imnoise(I,'gaussian',0.05); % 添加高斯噪声
PSF=fspecial('average',3); % fspecial('average',n)产生n*n矩阵的均值滤波
J=imfilter(I,PSF); % 算术均值滤波,imfilter函数用于对图像进行滤波,调用格式为J=imfilter(I,H)其中I为输入图像,H为滤波器
K=exp(imfilter(log(I),PSF)); % 几何均值滤波
subplot(131),imshow(I);
title('添加高斯噪声后的图像');
subplot(132),imshow(J);
title('算术均值滤波后的图像');
subplot(133),imshow(K);
title('几何均值滤波后的图像');
逆谐波均值滤波器的表达式为:
其中,Q为滤波器的阶数。当Q=0时,变为算数均值滤波器。当Q=-1时,变为谐波均值滤波器。当Q为正时,可以去除胡椒噪声。当Q为负时,可以去除盐粒噪声。
实现代码:
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
I=imnoise(I,'salt & pepper',0.01); % 添加椒盐噪声
PSF=fspecial('average',3); % fspecial('average',n)产生n*n矩阵的均值滤波
Q1=1.5; % Q为逆谐波均值滤波器的阶数,当Q为正时可去除椒噪声;当Q为负时可去除盐噪声(但不能同时去除椒和盐噪声)
Q2=-1.5;
j1=imfilter(I.^(Q1+1),PSF); % 根据逆谐波均值滤波器的表达式
j2=imfilter(I.^Q1,PSF);
J=j1./j2; % 逆谐波滤波,Q为正,注意.的用法,表示I中的每个元素都要进行相应操作(注意矩阵的维度相同)
k1=imfilter(I.^(Q2+1),PSF);
k2=imfilter(I.^Q2,PSF);
K=k1./k2; % 逆谐波滤波,Q为负
subplot(131),imshow(I);
title('添加椒盐噪声后的图像');
subplot(132),imshow(J);
title('Q为正数时的逆谐波均值滤波后的图像');% 去除椒噪声(黑色),显示盐噪声
subplot(133),imshow(K);
title('Q为负数时的逆谐波均值滤波后的图像');% 去除盐噪声(白色),显示椒噪声
4、谐波均值滤波器
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
I=imnoise(I,'gaussian',0,0.01); % 添加高斯噪声
PSF=fspecial('average',3); % fspecial('average',n)产生n*n矩阵的均值滤波
Q=1;
j1=imfilter(I.^(Q+1),PSF); % 根据谐波均值滤波器的表达式
j2=imfilter(I.^Q,PSF);
J=j1./j2; % 注意.的用法,表示I中的每个元素都要进行相应操作(注意矩阵的维度相同)
subplot(121),imshow(I);
title('添加高斯噪声后的图像');
subplot(122),imshow(J);
title('谐波均值滤波后的图像');
实现效果:
二、顺序统计滤波
1、中值滤波器
中值滤波器即将邻域像素灰度的中值作为中心点的灰度值。中值滤波能够很好地保留图像的边缘,非常适合去除椒盐噪声,效果优于均值滤波(注意窗口不能过大,会使图像的边缘变得模糊)。
实现代码:
close all;
clear all;
clc;
I=imread('cameraman.tif');
J=im2double(I);
J=imnoise(J,'salt & pepper',0.05); % 添加椒盐噪声
K=medfilt2(J,[3,3]); % 使用函数medfilt2()进行图像的二维中值滤波,调用格式为J=medfilt2(I)/J=medfilt2(I,[m,n]),默认窗口大小为3*3(可以设置窗口大小为m*n)
subplot(131),imshow(I);
title('原始图像');
subplot(132),imshow(J);
title('添加椒盐噪声后的图像');
subplot(133),imshow(K);
title('中值均值滤波后的图像');
2、最大值和最小值滤波器
最大值和最小值滤波器即以滤波窗口中排序最后一位或第一位代替窗口中心灰度值。
实现代码:
% 使用ordfilt2()函数对图像进行最大值和最小值滤波,通过设置参数order为实现
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I,'salt & pepper',0.01); % 添加椒盐噪声
K=ordfilt2(I,1,ones(4,4)); % 窗口模板4*4,取排序后最大值输出即第一个值(排序为降序)
M=ordfilt2(I,9,ones(3)); % 窗口模板3*3,取排序后最小值输出即最后一个值
subplot(221),imshow(I);
title('原始图像');
subplot(222),imshow(J);
title('添加椒盐噪声后的图像');
subplot(223),imshow(K);
title('最大值滤波后的图像');
subplot(224),imshow(M);
title('最小值滤波后的图像');
实现效果:
实现代码:
% 在进行排序滤波时,可以任意选择窗口的形状及排序后输出的像素位置,非常灵活
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I,'salt & pepper',0.1); % 添加椒盐噪声
domain=[0 1 1 0;1 1 1 1;1 1 1 1;0 1 1 0]; % 窗口模板4*4
K=ordfilt2(I,6,domain); % 使用函数ordfilt2()进行二维排序滤波,在进行滤波时,可以选择排序后的任意一个值作为输出,调用格式为J=ordfilt2(I,order,domain)其中order为选择的像素位置
subplot(131),imshow(I);
title('原始图像');
subplot(132),imshow(J);
title('添加椒盐噪声后的图像');
subplot(133),imshow(K);
title('二维排序滤波后的图像');
实现代码:
close all;
clear all;
clc;
RGB=imread('saturn.png');
I=rgb2gray(RGB); % 将RGB图像转为灰度图像
% imcrop为图像裁剪函数,调用的一般格式为I=imcrop(I,[a b c d])
% 其中(a,b)表示裁剪后左上角像素在原图像中的位置
% c表示裁剪后图像的宽,d表示裁剪后图像的高
I=imcrop(I,[100,100,1024,1024]);
J=imnoise(I,'gaussian',0,0.03); % 添加高斯噪声
% wiener2函数可以根据图像中噪声进行自适应维纳滤波
% 调用格式为[J,noise]=wiener2(I,[m,n]),对图像I进行自适应维纳滤波,窗口大小为m*n(默认情况3*3)
% noise为噪声的能量,J为滤波后的图像
[K,noise]=wiener2(J,[5,5]);
subplot(221),imshow(RGB);
title('原始图像');
subplot(222),imshow(I);
title('裁剪后的图像');
subplot(223),imshow(J);
title('添加高斯噪声后的图像');
subplot(224),imshow(K);
title('自适应滤波后的图像');
以上滤波器均可以用于去除图像中噪声!!!
参考博客:
(1)基于MATLAB的常见图像处理技术–图像复原技术
(2)matlab数字图像处理:图像复原及重建–常见的噪声模型以及滤波方法
由于刚刚开始学习图像处理,对于很多知识理解不到位。如有错误,恳请指正,任重而道远,慢慢加油!