1 打开图片
所有的滤波原始图片均使用下面的操作方式打开(只处理灰度图像):
[FileName,PathName,FilterIndex] = uigetfile({'*.png;*.jpg;*.jpeg';'*.*'},'选择一幅待处理图片'); filename = fullfile(PathName, FileName) ; SrcImg = imread(filename); [m n channels] = size(SrcImg); if(channels > 1) SrcImg = rgb2gray(SrcImg); setappdata(0,'SrcImg',SrcImg); imshow(SrcImg); else setappdata(0,'SrcImg',SrcImg); imshow(SrcImg); end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2 创建我们需要的噪声
对原始图像进行加噪声处理,即操作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; 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; 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; 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; 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; figure(); imshow(g_sp,[0 1]); imwrite(g_sp,'saltNoise.jpg','jpg'); xlabel('Ruselt of salt pepper noise');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
加噪结果:
原始图像:
椒盐噪声:
高斯噪声:
均匀噪声:
伽马噪声:
瑞利噪声:
3 开始滤波处理(空域和频域)
开始滤波了,通过上面的创建噪声并保存下了各种噪声的图像,接下来要用各种滤波方式将各种噪声降低,显然先要打开各个噪声图像,打开方式同第一节,这里不对各个滤波方式和原理讲解。
低通滤波: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]);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
高斯平滑: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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
自适应中值滤波: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 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_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]);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
维纳滤波:
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);
部分结果: