本文鏈接:https://blog.csdn.net/LYduring/article/details/80443573
一、目的
實現算術均值濾波器、幾何均值濾波器、中值濾波器、修正的阿爾法均值濾波器、自適應中值濾波器,並比較不同濾波器的降噪結果。
二、代碼
代碼的思路如下:
(1)先對原始的電路圖先后進行加高斯噪聲和椒鹽噪聲;之后設置濾波器的模板大小為5*5,分別對被噪聲污染的圖像進行算術均值、幾何均值、中值、修正的阿爾法濾波,並輸出圖像,方便結果比較。
(2)為了比較中值濾波器和自適應中值濾波器的濾波結果,先對原始電路圖添加椒鹽噪聲;接着對噪聲圖像進行模板大小為5*5的中值濾波;最后對噪聲圖像進行最大模板為5*5的自適應中值濾波,分別輸出濾波后的圖像,比較結果。
代碼具體實現如下:
%******************************************************% %目的:比較幾種不同均值濾波器和自適應中值濾波器的去噪聲效果 %日期:2018.5.18 %******************************************************% %讀入圖像 img = imread('img.tif'); figure; subplot(1,3,1); imshow(img); title('原始圖像'); %分別添加加入高斯噪聲和椒鹽噪聲 f1 = imnoise(img,'gaussian'); subplot(1,3,2) imshow(f1); title('添加高斯噪聲'); f2 = imnoise(f1,'salt & pepper'); subplot(1,3,3) imshow(f2); title('再添加椒鹽噪聲'); f2 = double(f2); [M,N] = size(f2); %%%%比較幾種均值濾波器及中值濾波器的濾波結果%%%%%% %算術均值濾波器 n = 5; %模板大小 f11 = f2; for i = 1:M-n+1 for j = 1:N-n+1 g1 = f2(i:i+n-1,j:j+n-1); s1 = sum(sum(g1)); %中心點的值用子圖像的算術均值代替 f11(i+(n-1)/2,j+(n-1)/2) = s1/(n*n); end end img1 = uint8(f11); figure; subplot(1,2,1); imshow(img1); title('算術均值濾波結果'); %幾何均值濾波器 n = 5; %模板大小 f21 = f2 + ones(M,N); %防止有個像素點為0而導致乘積為0 f12 = f21; for i = 1:M-n+1 for j = 1:N-n+1 g2 = f21(i:i+n-1,j:j+n-1); s2 = prod(g2(:)); %中心點的值用子圖像的幾何均值代替 f12(i+(n-1)/2,j+(n-1)/2) = s2.^(1/numel(g2)); end end img2 = uint8(f12); subplot(1,2,2); imshow(img2); title('幾何均值濾波結果'); %中值濾波器 img3 = uint8(medfilt2(f2,[5 5])); figure; subplot(1,2,1); imshow(img3); title('中值濾波結果'); %修正的阿爾法均值濾波器 n = 5; %模板大小 d = 5; %去掉最值灰度值的個數 f13 = f2; for i = 1:M-n+1 for j = 1:N-n+1 g3 = f2(i:i+n-1,j:j+n-1); g3 = sort(g3(:)); %對鄰域內的像素點進行排序 min_num = ceil(d/2); %去掉最小灰度值的個數 max_num = floor(d/2); %去掉最大灰度值的個數 %去掉d個最值灰度級后求算術均值 g3(1:min_num) = zeros(min_num,1); g3(n-max_num+1:n) = zeros(max_num,1); s3 = sum(g3); %中心點的值用子圖像的算術均值代替 f13(i+(n-1)/2,j+(n-1)/2) = s3/(n*n-d); end end img4 = uint8(f13); subplot(1,2,2); imshow(img4); title('修正的阿爾法均值濾波結果'); %%%%%%%比較中值濾波器及自適應中值濾波器的濾波結果%%%%%%% f2 = imnoise(img,'salt & pepper'); figure; subplot(1,4,1); imshow(img); title('原圖'); subplot(1,4,2); imshow(f2); title('添加椒鹽噪聲的圖像'); %中值濾波器 img5 = uint8(medfilt2(f2,[5 5])); subplot(1,4,3); imshow(img5); title('中值濾波結果'); %自適應中值濾波器 f14 = f2; alreadyPro = false(size(f2)); %看是否完成進程 Smax=5; %最大窗口尺寸 for s = 3:2:Smax %起始窗口尺寸設為3 %得到特定的灰度值 zmin = ordfilt2(f2, 1, ones(s, s), 'symmetric'); zmax = ordfilt2(f2, s * s, ones(s, s), 'symmetric'); zmed = medfilt2(f2, [s s], 'symmetric'); %進程B processB = (zmed > zmin) & (zmax > zmed) & ~alreadyPro; %進程A processA = (f2 > zmin) & (zmax > f2); outZxy = processB & processA; outZmed = processB & ~processA; f14(outZxy) = f2(outZxy); f14(outZmed) = zmed(outZmed); alreadyPro = alreadyPro | processB; if all(alreadyPro(:)) break; end end f14(~alreadyPro) = zmed(~alreadyPro); img6 = uint8(f14); subplot(1,4,4); imshow(img6); title('自適應中值濾波結果');
三、結果分析
得到的結果如下:
由濾波結果,我們可以看出,對於添加了高斯噪聲和椒鹽噪聲的圖像,算術均值和幾何均值濾波器的效果比較差,尤其是幾何均值濾波器;而中值濾波器和修正后的阿爾法均值濾波器的降噪效果比前面兩種濾波器的效果要好很多,修正的阿爾法均值濾波器的效果最好,使圖像變得更平滑。中值濾波器和自適應中值濾波器進行比較,兩者的降噪效果都不錯,不過中值濾波器導致了原始圖像細節的丟失,而自適應中值濾波器則很好地保持了原始圖像的清晰度和細節。