前言:本篇博客先介紹濾波器濾除噪聲,再介紹濾波器復原,側重於程序的實現。
一:三種常見的噪聲
二:空間域濾波
空間域濾波復原是在已知噪聲模型的基礎上,對噪聲的空間域進行濾波。
空間域濾波復原方法主要包括:
均值濾波器
算術均值濾波器
幾何均值濾波器
諧波均值濾波器
逆諧波均值濾波器
順序統計濾波器
中值濾波器
最大值/最小值濾波器
2.1算數均值濾波器
1 img=imread('D:/picture/ZiXia.jpg'); 2 img=rgb2gray(img); 3 figure,imshow(img);//原圖 4 img_noise=double(imnoise(img,'gaussian',0.06)); 5 figure,imshow(img_noise,[]);//含有高斯噪聲的圖 6 img_mean=imfilter(img_noise,fspecial('average',3));//濾波后的圖 7 figure;imshow(img_mean,[]);
2.2幾何均值濾波器
1 img=imread('cameraman.tif'); 2 img=rgb2gray(img); 3 figure,imshow(img); 4 img_noise=double(imnoise(img,'gaussian',0.06)); 5 figure,imshow(img_noise,[]); 6 img_mean=exp(imfilter(log(img_noise+1),fspecial('average',3))); 7 figure;imshow(img_mean,[]);
2.3諧波均值濾波器
2.4逆諧波均值濾波器
采用逆諧波均值濾波器對附加胡椒噪聲圖像進行濾波的matlab程序如下:
1 img=imread('cameraman.tif'); figure,imshow(img); 2 [M,N]=size(img);R=imnoise2('salt & pepper',M,N,0.1,0); 3 img_noise=img;img_noise(R==0)=0; 4 img_noise=double(img_noise); figure,imshow(img_noise,[]); 5 Q=1.5; 6 img_mean=imfilter(img_noise.^(Q+1),fspecial('average',3))./imfilter(img_noise.^Q,fspecial('average',3)); 7 figure;imshow(img_mean,[]);
采用逆諧波均值濾波器對附加鹽噪聲圖像進行濾波的matlab程序如下:
1 img=imread('csboard.tif');figure,imshow(img); 2 [M,N]=size(img);R=imnoise2('salt & pepper',M,N,0,0.1); 3 img_noise=img;img_noise(R==1)=255; 4 img_noise=double(img_noise); figure,imshow(img_noise,[]); 5 Q=-1.5; 6 img_mean=imfilter(img_noise.^(Q+1),fspecial('average',3))./imfilter(img_noise.^Q,fspecial('average',3)); 7 figure;imshow(img_mean,[]);
2.5中值濾波器
1 img=imread('cameraman.tif'); 2 img_noise=double(imnoise(img,'salt & pepper',0.06)); 3 img_mean=imfilter(img_noise,fspecial('average',5)); 4 img_median=medfilt2(img_noise);%一次中值濾波 5 img_median2=medfilt2(img_median);%二次中值濾波
2.6最大值,最小值濾波器
利用最大值濾波器消除胡椒噪聲污染圖像的matlab程序如下。
1 img=imread('csboard.tif'); 2 [M,N]=size(img); 3 R=imnoise2('salt & pepper',M,N,0.1,0); 4 img_noise=img; 5 img_noise(R==0)=0; 6 img_noise=double(img_noise); 7 imwrite(uint8(img_noise),'csbord_pepper.jpg'); 8 img_max=imdilate(img_noise,ones(3,3)); 9 imwrite(uint8(img_max),'cameraman_saltpepper_max.jpg');
利用最小值濾波器消除鹽噪聲污染圖像的matlab程序如下。
1 img=imread('csboard.tif'); 2 [M,N]=size(img); 3 R=imnoise2('salt & pepper',M,N,0,0.1); 4 img_noise=img; 5 img_noise(R==1)=255; 6 img_noise=double(img_noise); 7 imwrite(uint8(img_noise),'csbord_salt.jpg'); 8 img_min=imerode(img_noise,ones(3,3)); 9 imwrite(uint8(img_min),'cameraman_saltpepper_min.jpg');
2.7帶阻濾波器
1 I=imread('pout.tif'); 2 [m,n]=size(I); 3 J=I; 4 for i=1:m 5 for j=1:n 6 J(i,j)=I(i,j)+20*sin(20*i)+20*sin(20*j);%增加周期性噪聲 7 end 8 end 9 IF=fftshift(fft2(I)); 10 JF=fftshift(fft2(J)); 11 IF=log(1+abs(IF)); 12 JF=log(1+abs(JF)); 13 14 subplot(221)%顯示頻譜 15 imshow(IF,[]) 16 subplot(222) 17 imshow(JF,[]) 18 %高斯帶阻濾波器構造 19 fbrf=ones(m,n); 20 for i=1:m 21 for j=1:n 22 fbrf(i,j)=1-exp(-0.5*(((i-m/2)^2+(j-n/2)^2-55^2)/(sqrt(i.^2+j.^2)*5))^2);%20為帶阻中心,5為帶寬 23 end 24 end 25 H=fbrf; 26 %頻率域濾波 27 f=fftshift(fft2(J)); 28 out=f.*H;%頻率域濾波 29 out=ifft2(ifftshift(out)); 30 out=abs(out); 31 out=out/max(out(:));%歸一化【0,1】 32 subplot(223) 33 imshow(out,[]); 34 subplot(224) 35 imshow(J,[])
2.8帶通濾波器
2.9陷波濾波器
1 clear; 2 close all; 3 src = im2double(imread('D:/picture/ZiXia.jpg')); 4 src = rgb2gray(src); 5 subplot(221) 6 imshow(src); 7 title('原始圖像'); 8 [w h] = size(src); 9 srcf = fft2(src); 10 srcf = fftshift(srcf); 11 subplot(222) 12 imshow(srcf); 13 % 低通濾波 14 % flt = zeros(size(src)); 15 % rx1 = w/2; 16 % ry1 = h/2; 17 % r = min(w,h)/3; 18 % for i = 1:w 19 % for j = 1:h 20 % if(rx1-i)^2 +(ry1 - j)^2 <= r*r 21 % flt(i,j) = 1; 22 % end 23 % end 24 % end 25 % 陷波濾波 26 flt = ones(size(src)); 27 r = min(w,h)/12; 28 rx1 = r 29 ry1 =h/2 30 for i = 1:w 31 for j = 1:h 32 if(rx1-i)^2 +(ry1 - j)^2 <= r*r 33 flt(i,j) = 0; 34 end 35 if(w-rx1-i)^2 +(h-ry1 - j)^2 <= r*r 36 flt(i,j) = 0; 37 end 38 end 39 end 40 subplot(223) 41 imshow(flt); 42 title('濾波器圖像'); 43 dfimg = srcf.*flt; 44 dfimg = ifftshift(dfimg); 45 dimg = ifft2(dfimg,'symmetric'); 46 subplot(224) 47 imshow(dimg):title('濾波后');
2.9逆濾波
1 image_o=imread('D:/picture/lenagray.jpg'); 2 subplot(1,3,1); 3 imshow(image_o); 4 title('原圖像'); 5 %頻率域退化圖像,退化函數H(u,v)=exp(-0.0025*( (u-M/2).^2+(v-N/2).^2).^(5/6) ) 6 %傅里葉變換 7 f=im2double(image_o); 8 F=fft2(f); 9 F=fftshift(F); 10 %執行退化 11 [M,N]=size(F); 12 [u,v]=meshgrid(1:M,1:N);%生成二維坐標系 13 H=exp(-0.0025* ( (u-M/2).^2+(v-N/2).^2).^(5/6) ); 14 F=F.*H; 15 %傅里葉反變換 16 X=ifftshift(F); 17 x=ifft2(X); 18 x=uint8(abs(x)*256); 19 subplot(1,3,2); 20 imshow(x); 21 % 22 title('退化圖像'); 23 24 image_d=x; 25 %直接逆濾波圖像復原 26 27 ff=im2double(image_d);%將圖像灰度值歸一化到0-1之間 28 29 % 傅里葉變換 30 f_Id=fft2(ff); 31 f_Id=fftshift(f_Id); 32 fH_Id=f_Id; 33 [M,N]=size(fH_Id); 34 % 逆濾波 35 threshold=78; 36 if threshold>M/2 37 %全濾波 38 fH_Id=fH_Id./(H+eps); 39 else 40 %對一定半徑范圍內進行濾波 41 for i=1:M 42 for j=1:N 43 if sqrt((i-M/2).^2+(j-N/2).^2)<threshold 44 fH_Id(i,j)=fH_Id(i,j)./(H(i,j)+eps); 45 end 46 end 47 end 48 end 49 50 % 執行傅立葉逆變換 51 fH_Id1=ifftshift(fH_Id); 52 f_new=ifft2(fH_Id1); 53 f_new=uint8(abs(f_new)*255); 54 subplot(1,3,3); 55 imshow(f_new); 56 title('濾波半徑=78的逆濾波復原圖像');
2.10維納濾波
直接截圖了,沒敲