所有的滤波原始图片均使用下面的操作方式打开(只处理灰度图像):
% 读取图像 可以处理彩色多通道图片(转化为灰度图像)
[FileName,PathName,FilterIndex] = uigetfile({'*.png;*.jpg;*.jpeg';'*.*'},'选择一幅待处理图片');
filename = fullfile(PathName, FileName) ;
SrcImg = imread(filename);
% setappdata(0,'SrcData',SrcImg);
% 获取图像的信息
[m n channels] = size(SrcImg);
if(channels > 1)
% 将彩色图象转为灰度图像
SrcImg = rgb2gray(SrcImg);
% 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声
setappdata(0,'SrcImg',SrcImg);
imshow(SrcImg);
else
% 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声
setappdata(0,'SrcImg',SrcImg);
imshow(SrcImg);
end
对原始图像进行加噪声处理,即操作SrcImg
:
% 获取原始图像数据
SrcImg = getappdata('SrcImg');
% 变换
f = mat2gray(SrcImg,[0 255]);
% 获取图像大小信息
[M,N] = size(f);
%% 高斯噪声
a = 0;
b = 0.08;
n_gaussian = a + b .* randn(m,n);
g_gaussian = f + n_gaussian;
% show image
figure();
imshow(g_gaussian,[0 1]);
% 保存图片
imwrite(g_gaussian,'gaussianNoise.jpg','jpg');
xlabel('Ruselt of Gaussian noise');
%% 瑞利噪声
a = -0.2;
b = 0.03;
n_rayleigh = a + (-b .* log(1 - rand(M,N))).^0.5;
g_rayleigh = f + n_rayleigh;
% show image
figure();
imshow(g_rayleigh,[0 1]);
imwrite(g_rayleigh,'rayleighNoise.jpg','jpg');
xlabel('Ruselt of rayleigh noise');
%% 伽马噪声
a = 25;
b = 3;
n_Erlang = zeros(M,N);
for j=1:b
n_Erlang = n_Erlang + (-1/a)*log(1 - rand(M,N));
end
g_Erlang = f + n_Erlang;
% show image
figure();
imshow(g_Erlang,[0 1]);
imwrite(g_Erlang,'erlangNoise.jpg','jpg');
xlabel('Ruselt of erlang noise');
%% 均匀噪声
a = 0;
b = 0.3;
n_Uniform = a + (b-a)*rand(M,N);
g_Uniform = f + n_Uniform;
% show image
figure();
imshow(g_Uniform,[0 1]);
imwrite(g_Uniform,'uniformNoise.jpg','jpg');
xlabel('Ruselt of uniform noise');
%% 椒盐噪声
a = 0.05;
b = 0.05;
x = rand(M,N);
g_sp = zeros(M,N);
g_sp = f;
g_sp(find(x<=a)) = 0;
g_sp(find(x > a & x<(a+b))) = 1;
% show image
figure();
imshow(g_sp,[0 1]);
imwrite(g_sp,'saltNoise.jpg','jpg');
xlabel('Ruselt of salt pepper noise');
加噪结果:
原始图像:
椒盐噪声:
高斯噪声:
均匀噪声:
伽马噪声:
瑞利噪声:
开始滤波了,通过上面的创建噪声并保存下了各种噪声的图像,接下来要用各种滤波方式将各种噪声降低,显然先要打开各个噪声图像,打开方式同第一节,这里不对各个滤波方式和原理讲解。
低通滤波:f为加噪图像
f = mat2gray(f,[0 255]);
[M,N] = size(f);
P = 2*M;
Q = 2*N;
fc = zeros(M,N);
for x = 1:1:M
for y = 1:1:N
fc(x,y) = f(x,y) * (-1)^(x+y);
end
end
F = fft2(fc,P,Q);
H_1 = zeros(P,Q);
H_2 = zeros(P,Q);
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
D_0 = 100;
H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);
H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^6);
end
end
G_1 = H_1 .* F;
G_2 = H_2 .* F;
g_1 = real(ifft2(G_1));
g_1 = g_1(1:1:M,1:1:N);
g_2 = real(ifft2(G_2));
g_2 = g_2(1:1:M,1:1:N);
for x = 1:1:M
for y = 1:1:N
g_1(x,y) = g_1(x,y) * (-1)^(x+y);
g_2(x,y) = g_2(x,y) * (-1)^(x+y);
end
end
%% 显示图像
figure();
imshow(g_2,[0 1]);
高斯平滑:f为加噪图像
f=double(f);
f=fft2(f);
f=fftshift(f);
[m,n]=size(f);
d0=80;
m1=fix(m/2);
n1=fix(n/2);
for i=1:m
for j=1:n
d=sqrt((i-m1)^2+(j-n1)^2);
h(i,j)=exp(-d^2/2/d0^2);
end
end
g=f.*h;
g=ifftshift(g);
g=ifft2(g);
g=mat2gray(real(g));
%% 显示图像
figure();
imshow(g);
自适应中值滤波:f为噪声图像
f = mat2gray(f,[0 255]);
[M,N] = size(f);
g_sp = f;
x = linspace(-0.2,1.2,358);
h = hist(g_sp,x)/(M*N);
Histogram = zeros(358,1);
for y = 1:256
Histogram = Histogram + h(:,y);
end
%%
S_max = 7;
w = zeros(S_max,S_max);
w(round(S_max/2),round(S_max/2)) = 1;
g_Ex = imfilter(g_sp,w,'symmetric','full');
g_Admf = zeros(M,N);
S = 3;
for x = 4:M+3
for y = 4:N+3
% A
for S = 3:2:S_max
S_xy = zeros(S,S);
for s = 1:1:S
for t = 1:1:S
S_xy(s,t) = g_Ex(x+s-round(S/2),y+t-round(S/2));
end
end
z_min = min(S_xy(:));
z_max = max(S_xy(:));
z_med = median(S_xy(:));
A_1 = z_med - z_min;
A_2 = z_med - z_max;
if ((A_1>0)&&(A_2<0))
% B
B_1 = g_Ex(x,y) - z_min;
B_2 = g_Ex(x,y) - z_max;
if((B_1>0)&&(B_2<0)) g_Admf(x-3,y-3) = z_med;break;
else g_Admf(x-3,y-3) = z_med; break;
end
end
if(S >= S_max) g_Admf(x-3,y-3) = z_med; break;
end
end
end
end
%% 显示结果
figure();
imshow(g_Admf,[0,1]);
维纳滤波:
afterFilter = wiener2(f,[7 7]);
figure();
imshow(afterFilter);
最大值滤波、中值滤波、最小值滤波:调节参数即可,5相当于中值滤波
afterFilter = ordfilt2(f,5,ones(3,3));
figure();
imshow(afterFilter);
复合滤波:
```matlab
afterFilter1 = ordfilt2(f,5,ones(3,3));
h_gaosi1=fspecial('gaussian',3,1);
afterFilter2 = imfilter(afterFilter1,h_gaosi1);
afterFilter3 = wiener2(afterFilter2,[7 7]);
figure();
imshow(afterFilter3);