1. 程式人生 > >中值濾波原理及MATLAB演算法實現

中值濾波原理及MATLAB演算法實現

中值濾波是一種非線性濾波方式,它依靠模板來實現。

對於一維中值濾波,設模板的尺寸為 M ,M=2*r+1,r為模板半徑,給定一維訊號f(i),i = 1,2,3……N,則中值濾波輸出為:

g(i) = median[ f(j-r),f(j-r+1),…………,f(j),f(j+r)]。

對於二維的中值濾波情況,g(x,y) = median[ f(s, t)],對於一個模板尺寸為N*N的中值濾波器,其輸出值應大於等於模板中(N*N-1)/ 2,同時也應小於等於模板中(N*N-1)/ 2,(N一般取奇數)。

中值濾波器可用一下步驟來完成:

(1)將模板在圖中漫遊,並將模板中心與圖中某個畫素位置重合;

(2)讀取模板下各對應畫素的灰度值;

(3)將這些灰度值從小到大排列;

(4)找出這些灰度值裡面排在中間的那個;

(5)將這個中間值賦給對應模板中心位置的畫素。

一下將給出MATLAB程式:

x = imread('C:\Users\Administrator\Desktop\im7.jpg');
x = rgb2gray(x);
[m, n] = size(x); %m表示行數(即高度);n表示列數(即寬度)
x = imnoise(x,'salt & pepper',0.02);
subplot(1,2,1)
imshow(x);
x1 = double(x);
x2 = x1;
%% --------------------------------%
% 此處的演算法缺點是未對邊界值做出改變
for i = 1:m-3+1
    for j = 1:n-3+1
        mb = x1( i:(i+3-1), j:(j+3-1) ); %取出模板元素
        mb = mb(:);     %矩陣中的元素以一列輸出
        mm = median(mb);%取向量的中值 
        x2( i+(3-1)/2, j+(3-1)/2 ) = mm; %對中心元素賦值
    end
end
%% --------------------------------%
dstImage = uint8(x2);
subplot(1,2,2)
imshow(dstImage);

其結果如圖: