1) 產生噪聲
-
構造函數
addSaltNoise.m
,接受參數snr
爲圖像信噪比,爲實驗用圖test.tif
增加椒鹽噪聲% addSaltNoise.m function [sImg] = addSaltNoise(snr) img=imread('test.tif'); [imgH,imgW]=size(img); sImg=img; % 根據圖像信噪比產生噪聲點數量 sp=imgH*imgW; np=sp*(1-snr); % 隨機行列,給圖像添加噪聲 for i=1:np x=uint32(rand()*imgH); y=uint32(rand()*imgW); if x && y r=rand()>0.5; if r sImg(x,y)=0; else sImg(x,y)=255; end end end subplot(1,2,1); imshow(img),title('原始圖像'); subplot(1,2,2); imshow(sImg),title('信噪比爲0.5的椒鹽噪聲圖像'); end
信噪比爲0.5時的椒鹽噪聲圖像,如下圖所示:
-
構造函數
addGaussianNoise.m
,接受參數avg爲均值,std爲標準差,爲實驗用圖test.tif
增加高斯噪聲% addGaussianNoise.m function [gImg] = addGaussianNoise(avg,std) img=imread('test.tif'); [imgH,imgW]=size(img); % 產生和圖像維度相同的噪聲,疊加到圖像上 gImg=uint8((double(img)/255+avg+std*randn(imgH,imgW))*255); % subplot(1,2,1); % imshow(img),title('原始圖像'); % % subplot(1,2,2); % imshow(gImg),title('均值爲'+string(avg)+'標準差爲'+string(std)+'的高斯噪聲圖像');
產生的高斯噪聲效果如下圖
2) 均值濾波器
-
算術均值濾波器
編寫函數
meanValueFilter.m
,參數fsize
爲濾波器大小% meanValueFilter.m function []=meanValueFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sNewImg(i,j)=sum(sTemp(:))/numel(sTemp); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gNewImg(i,j)=sum(gTemp(:))/numel(gTemp); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('均值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('均值濾波器處理後圖像'); end
大小爲3x3的算術均值濾波器處理椒鹽噪聲結果
大小爲3x3的算術均值濾波器處理高斯噪聲結果
-
幾何均值濾波器
編寫函數
geometricMeanFilter.m
,參數fsize
爲濾波器大小function []=geometricMeanFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sNewImg(i,j)=prod(prod(sTemp(:)))^(1/numel(sTemp)); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gNewImg(i,j)=prod(prod(gTemp(:)))^(1/numel(gTemp)); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('幾何均值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('幾何均值濾波器處理後圖像'); end
大小爲3x3的幾何均值濾波器處理椒鹽噪聲結果
大小爲3x3的幾何均值濾波器處理高斯噪聲結果
-
諧波均值濾波器
編寫函數
harmonicMeanFilter.m
,參數fsize
爲濾波器大小function []=harmonicMeanFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sTemp=1./sTemp; sNewImg(i,j)=numel(sTemp)/sum(sTemp(:)); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gTemp=1./gTemp; gNewImg(i,j)=numel(gTemp)/sum(gTemp(:)); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('諧波均值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('諧波均值濾波器處理後圖像'); end
大小爲3x3的諧波均值濾波器處理椒鹽噪聲結果
大小爲3x3的諧波均值濾波器處理高斯噪聲結果
-
逆諧波均值濾波器
編寫函數
inverseHarmonicMeanFilter.m
,參數fsize
爲濾波器大小,q爲階數function []=inverseHarmonicMeanFilter(fsize,q) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = double (sImg(i-flength:i+flength,j-flength:j+flength)); sNewImg(i,j)=sum(sTemp(:).^(q+1))/sum(sTemp(:).^(q)); gTemp = double (gImg(i-flength:i+flength,j-flength:j+flength)); gNewImg(i,j)=sum(gTemp(:).^(q+1))/sum(gTemp(:).^(q)); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('逆諧波均值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('逆諧波均值濾波器處理後圖像'); end
大小爲3x3,階數爲1.5的逆諧波均值濾波器處理椒鹽噪聲結果
大小爲3x3,階數爲1.5的逆諧波均值濾波器處理高斯噪聲結果
3) 統計排序濾波器
-
中值濾波器
編寫函數
middleFilter.m
,參數fsize
爲濾波器大小function []=middleFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sTemp = sort(sTemp(:)); sNewImg(i,j)=sTemp((numel(sTemp)-1)/2); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gTemp = sort(gTemp(:)); gNewImg(i,j)=gTemp((numel(gTemp)-1)/2); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('中值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('中值濾波器處理後圖像'); end
大小爲3x3的中值濾波器處理椒鹽噪聲結果
大小爲3x3的中值濾波器處理高斯噪聲結果
-
最大值和最小值濾波器
-
最大值濾波器
編寫函數
maxFilter.m
,參數fsize
爲濾波器大小function []=maxFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sNewImg(i,j)= max(sTemp(:)); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gNewImg(i,j)=max(gTemp(:)); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('最大值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('最大值濾波器處理後圖像'); end
大小爲3x3的最大值濾波器處理椒鹽噪聲結果
大小爲3x3的最大值濾波器處理高斯噪聲結果
-
最小值濾波器
編寫函數
minFilter.m
,參數fsize
爲濾波器大小function []=minFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sNewImg(i,j) = min(sTemp(:)); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gNewImg(i,j) = min(gTemp(:)); end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('最小值濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('最小值濾波器處理後圖像'); end
大小爲3x3的最小值濾波器處理椒鹽噪聲結果
大小爲3x3的最小值濾波器處理高斯噪聲結果
-
-
中點濾波器
編寫函數
mPointFilter.m
,參數fsize
爲濾波器大小function []=mPointFilter(fsize) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sNewImg(i,j) = (min(sTemp(:))+max(sTemp(:)))/2; gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gNewImg(i,j) = (min(gTemp(:))+max(gTemp(:)))/2; end end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('中點濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('中點濾波器處理後圖像'); end
大小爲3x3的中點濾波器處理椒鹽噪聲結果
大小爲3x3的中點濾波器處理高斯噪聲結果
-
修正後的阿爾法均值濾波器
編寫函數
alphaFilter.m
,參數fsize
爲濾波器大小,d爲0-fsize^2之間的數字function []=alphaFilter(fsize,d) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = addSaltNoise(0.5); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = addGaussianNoise(0,0.1); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end if d<fsize*fsize % 處理圖像,結果分別保存在sNewImg和gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength if d>0 sTemp = sImg(i-flength:i+flength,j-flength:j+flength); sTemp = sort(sTemp(:)); sTemp=sTemp(d:numel(sTemp)-1); sNewImg(i,j)=sum(sTemp())/numel(sTemp); gTemp = gImg(i-flength:i+flength,j-flength:j+flength); gTemp = sort(gTemp(:)); gTemp=gTemp(d:numel(gTemp)-1); gNewImg(i,j)=sum(gTemp())/numel(gTemp); end end end else fprintf("d請傳入0-fsize^2之間的數!"); end subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('修正後的阿爾法濾波器處理後圖像'); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('修正後的阿爾法濾波器處理後圖像'); end
大小爲3x3的修正後的阿爾法均值濾波器(d=1)處理椒鹽噪聲結果
大小爲3x3的修正後的阿爾法均值濾波器(d=1)處理高斯噪聲結果
4) 自適應濾波器
-
自適應濾波器
編寫函數
alphaFilter.m
,參數fsize
爲濾波器大小function []=adaptFilter(fsize) % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = double(addGaussianNoise(0,0.1)); [imgH,imgW]=size(gImg); gNewImg = gImg; % 根據濾波器尺寸計算半長 if mod(fsize,2) flength = (fsize-1)/2; else flength = fsize/2; end % 處理圖像,結果保存在gNewImg for i=1+flength:imgH-flength for j=1+flength:imgW-flength gTemp = gImg(i-flength:i+flength,j-flength:j+flength); avg = mean(gTemp(:)); v = var(gTemp(:)); gNewImg(i,j)=gImg(i,j)-255*255*0.01/v*(gImg(i,j)-avg); end end gImg = uint8(gImg); gNewImg=uint8(gNewImg); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('自適應濾波器處理後圖像'); end
大小爲7x7的自適應濾波器處理,方差爲6502.5的高斯噪聲結果
-
自適應中值濾波器
編寫函數
alphaFilter.m
,參數fmax
爲濾波器最大尺寸function []=adaptMiddleFilter(fmax) % 獲取信噪比爲0.5的椒鹽噪聲圖像 sImg = double(addSaltNoise(0.5)); % 獲取均值爲0,標準差爲0.1的高斯噪聲圖像 gImg = double(addGaussianNoise(0,0.1)); [imgH,imgW]=size(sImg); sNewImg=sImg; gNewImg=gImg; % 計算濾波器最大半長 if mod(fmax,2) flength = (fmax-1)/2; else flength = fmax/2; end % 處理圖像,結果分別保存在sNewImg和gNewImg % zmax爲s區域中的灰度最大值 % zmin爲s區域中的灰度最小值 % zmed爲s區域中的灰度中間值 for i=1+flength:imgH-flength for j=1+flength:imgW-flength len = 1; while len<=flength sTemp = sImg(i-len:i+len,j-len:j+len); sTemp=sort(sTemp(:)); zsmed=sTemp((numel(sTemp)-1)/2); zsmin=min(sTemp); zsmax=max(sTemp); ag1 = zsmed-zsmin; ag2 = zsmed-zsmax; if ag1>0 && ag2<0 break; else len=len+1; end end if len==flength+1 sNewImg(i,j)=sImg(i,j); else bs1=sImg(i,j)-zsmin; bs2=sImg(i,j)-zsmax; if bs1>0 && bs2<0 sNewImg(i,j)=sImg(i,j); else sNewImg(i,j)=zsmed; end end len = 1; while len<=flength gTemp = gImg(i-len:i+len,j-len:j+len); gTemp=sort(gTemp(:)); zgmed=gTemp((numel(gTemp)-1)/2); zgmin=min(gTemp); zgmax=max(gTemp); ag1 = zgmed-zgmin; ag2 = zgmed-zgmax; if ag1>0 && ag2<0 break; else len=len+1; end end if len==flength+1 gNewImg(i,j)=gImg(i,j); else bg1=gImg(i,j)-zgmin; bg2=gImg(i,j)-zgmax; if bg1>0 && bg2<0 gNewImg(i,j)=gImg(i,j); else gNewImg(i,j)=zgmed; end end end end % 處理完後轉化爲uint8 sImg=uint8(sImg); sNewImg=uint8(sNewImg); subplot(1,2,1); imshow(sImg),title('椒鹽噪聲圖像'); subplot(1,2,2); imshow(sNewImg),title('自適應中值濾波器處理後圖像'); gImg=uint8(gImg); gNewImg=uint8(gNewImg); figure(); subplot(1,2,1); imshow(gImg),title('高斯噪聲圖像'); subplot(1,2,2); imshow(gNewImg),title('自適應中值濾波器處理後圖像'); end
最大尺寸爲7x7的自適應濾波器處理椒鹽噪聲結果
最大尺寸爲7x7的自適應濾波器處理高斯噪聲結果