基於MATLAB影象處理的中值濾波、均值濾波以及高斯濾波的實現與對比
基於MATLAB影象處理的中值濾波、均值濾波以及高斯濾波的實現與對比
作者:lee神
1.背景知識
中值濾波法是一種非線性平滑技術,它將每一畫素點的灰度值設定為該點某鄰域視窗內的所有畫素點灰度值的中值.
中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性訊號處理技術,中值濾波的基本原理是把數字影象或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的畫素值接近的真實值,從而消除孤立的噪聲點。
方法是用某種結構的二維滑動模板,將板內畫素按照畫素值的大小進行排序,生成單調上升(或下降)的為二維資料序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l
2 |
4 |
8 |
1 |
3 |
9 |
5 |
7 |
6 |
g(x,y)=med{f(x-k,y-l),(k,l∈W)}
g =med[2,4,8;1,3,9;5,7,6] = 5
中值濾波後的結果:
5 |
均值濾波是典型的線性濾波演算法,它是指在影象上對目標畫素給一個模板,該模板包括了其周圍的臨近畫素(以目標畫素為中心的周圍8個畫素,構成一個濾波模板,即去掉目標畫素本身),再用模板中的全體畫素的平均值來代替原來畫素值。
均值濾波也稱為線性濾波,其採用的主要方法為鄰域平均法。線性濾波的基本原理是用均值代替原影象中的各個畫素值,即對待處理的當前畫素點(x,y),選擇一個模板,該模板由其近鄰的若干畫素組成,求模板中所有畫素的均值,再把該均值賦予當前畫素點(x,y),作為處理後圖像在該點上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m為該模板中包含當前畫素在內的畫素總個數。
均值濾波本身存在著固有的缺陷,即它不能很好地保護影象細節,在影象去噪的同時也破壞了影象的細節部分,從而使影象變得模糊,不能很好地去除噪聲點。
2 |
4 |
8 |
1 |
3 |
9 |
5 |
7 |
6 |
g(x,y)=1/m ∑f(x,y)
g = (1/8)*(2+4+8+1+9+5+7+6)= 5
均值濾波後的結果:
5 |
高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於影象處理的減噪過程。通俗的講,高斯濾波就是對整幅影象進行加權平均的過程,每一個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描影象中的每一個畫素,用模板確定的鄰域內畫素的加權平均灰度值去替代模板中心畫素點的值。
2.MATLAB實現
原始碼:
%%-------------------------------------------------------------------------------------------
%% 2018/01/03
%% lee
%% 微信公眾號:FPGA開源工作室
%%--------------------------------------------------------------------------------------------
clear all;
clc;
M = imread('timg.jpg'); %讀取MATLAB中的名為timg的影象
figure,imshow(M); %顯示原始影象
title('original');
gray = rgb2gray(M);
figure,imshow(gray); %顯示灰度影象
title('gray');
P1 = imnoise(gray,'gaussian',0.02); %加入高斯躁聲
figure,imshow(P1); %加入高斯躁聲後顯示影象
title('gaussiannoise');
P2 = imnoise(gray,'salt& pepper',0.02); %加入椒鹽躁聲
figure,imshow(P2); %加入椒鹽躁聲後顯示影象
title('salt& pepper noise');
g = medfilt2(P1); %對高斯躁聲中值濾波
figure,imshow(g);
title('medfiltergaussian');
h = medfilt2(P2); %對椒鹽躁聲中值濾波
figure,imshow(h);
title('medfiltersalt & pepper noise');
a=[1 1 1 %對高斯躁聲算術均值濾波
1 11
1 11];
l=1/9*a;
k = conv2(double(P1),double(l));
figure,imshow(k,[]);
title('arithmeticfiltergaussian');
d = conv2(double(P2),double(l)); %對椒鹽躁聲算術均值濾波
figure,imshow(d,[]);
title('arithmeticfiltersalt & pepper noise');
sigma=8;%標準差大小
window=double(uint8(3*sigma)*2+1);%視窗大小一半為3*sigma
H=fspecial('gaussian',window, sigma);%fspecial('gaussian',hsize, sigma)產生濾波模板
img_gauss=imfilter(P1,H,'replicate'); %為了不出現黑邊,使用引數'replicate'(輸入影象的外部邊界通過複製內部邊界的值來擴充套件)
figure, imshow(img_gauss);
title('gaussianfilting gauss noise');
img_salt=imfilter(P2,H,'replicate');
figure, imshow(img_salt);
title('gaussianfilting salt pepper noise');
結果展示:
原始影象
灰度影象
加入高斯噪聲的灰度影象
加入椒鹽噪聲的灰度影象
經過中值濾波後的高斯噪聲灰度影象
經過中值濾波後的椒鹽噪聲灰度影象
經過均值濾波的高斯噪聲灰度影象
經過均值濾波的椒鹽噪聲灰度影象
經過高斯濾波的高斯噪聲灰度影象
經過高斯濾波的椒鹽噪聲的灰度影象
結果分析:影象經過中值濾波後,高斯噪聲沒有被完全去除,椒鹽噪聲幾乎被完全去除效果較好。經過均值濾波後不管是高斯噪聲還是椒鹽噪聲大部分都沒有被去除,只是稍微模糊化。經過高斯濾波後,高斯噪聲和椒鹽噪聲幾乎被很大程度的模糊化,原圖好像被加上了一層蒙版。
歡迎大家關注我的微信公眾號FPGA開源工作室和資源共享QQ群。(*  ̄3)(ε ̄ *)