雖然matlab裡面有這些函數,但是攀立民老師要求自己編寫,計算機視覺上有這個實驗,到網上找了半天才零散的找到一些碎片,還是整理以後發上來吧!
MatLab自編的均值濾波、中值濾波、高斯濾波 圖像處理函數。
%自編的均值濾波函數。x是需要濾波的圖像,n是模闆大小(即n×n)
function d=avefilt(x,n)
a(1:n,1:n)=1; %a即n×n模闆,元素全是1
p=size(x); %輸入圖像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
%A(a:b,c:d)表示A矩陣的第a到b行,第c到d列的所有元素
for i=1:p(1)-n+1
for j=1:p(2)-n+1
c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的n行n列元素與模闆相乘
s=sum(sum(c)); %求c矩陣(即模闆)中各元素之和
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模闆各元素的均值賦給模闆中心位置的元素
end
end
%未被指派的元素取原值
d=uint8(x2);
%自編的中值濾波函數。x是需要濾波的圖像,n是模闆大小(即n×n)
function d=midfilt(x,n)
p=size(x); %輸入圖像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:p(1)-n+1
for j=1:p(2)-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中從(i,j)開始的n行n列元素,即模闆(n×n的)
e=c(1,:); %是c矩陣的第一行
for u=2:n
e=[e,c(u,:)]; %将c矩陣變為一個行矩陣
end
mm=median(e); %mm是中值
x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模闆各元素的中值賦給模闆中心位置的元素
end
end
%未被指派的元素取原值
d=uint8(x2);
%自編的高斯濾波函數,S是需要濾波的圖象,n是均值,k是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%計算圖象中心
for i=1:n
for j=1:n
b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);
end
end
%生成高斯序列b。
Img1=conv2(Img,b,\'same\'); %用生成的高斯序列卷積運算,進行高斯濾波
d=uint8(Img1);
%此為程式主檔案,包含主要功能單元,以及對子函數進行調用
try
%實驗步驟一:彩色、灰階變換
h=imread(\'photo.jpg\'); %讀入彩色圖檔
c=rgb2gray(h); %把彩色圖檔轉化成灰階圖檔,256級
figure,imshow(c),title(\'原始圖象\'); %顯示原始圖象
g=imnoise(c,\'gaussian\',0.1,0.002); %加入高斯噪聲
figure,imshow(g),title(\'加入高斯噪聲之後的圖象\'); %顯示加入高斯噪聲之後的圖象
%實驗步驟二:用系統預定義濾波器進行均值濾波
n=input(\'請輸入均值濾波器模闆大小\n\');
A=fspecial(\'average\',n); %生成系統預定義的3X3濾波器
Y=filter2(A,g)/255; %用生成的濾波器進行濾波,并歸一化
figure,imshow(Y),title(\'用系統函數進行均值濾波後的結果\'); %顯示濾波後的圖象
%實驗步驟三:用自己的編寫的函數進行均值濾波
Y2=avefilt(g,n); %調用自編函數進行均值濾波,n為模闆大小
figure,imshow(Y2),title(\'用自己的編寫的函數進行均值濾波之後的結果\'); %顯示濾波後的圖象
%實驗步驟四:用Matlab系統函數進行中值濾波
n2=input(\'請輸入中值濾波的模闆的大小\n\');
Y3=medfilt2(g,[n2 n2]); %調用系統函數進行中值濾波,n2為模闆大小
figure,imshow(Y3),title(\'用Matlab系統函數進行中值濾波之後的結果\'); %顯示濾波後的圖象
%實驗步驟五:用自己的編寫的函數進行中值濾波
Y4=midfilt(g,n2); %調用自己編寫的函數進行中值濾波,
figure,imshow(Y4),title(\'用自己編寫的函數進行中值濾波之後的結果\');
%實驗步驟六:用matlab系統函數進行高斯濾波
n3=input(\'請輸入高斯濾波器的均值\n\');
k=input(\'請輸入高斯濾波器的方差\n\');
A2=fspecial(\'gaussian\',k,n3); %生成高斯序列
Y5=filter2(A2,g)/255; %用生成的高斯序列進行濾波
figure,imshow(Y5),title(\'用Matlab函數進行高斯濾波之後的結果\'); %顯示濾波後的圖象
%實驗步驟七:用自己編寫的函數進行高斯濾波
Y6=gaussfilt(n3,k,g); %調用自己編寫的函數進行高斯濾波,n3為均值,k為方差
figure,imshow(Y6),title(\'用自編函數進行高斯濾波之後的結果\'); %顯示濾波後的圖象
catch %捕獲異常
disp(lasterr); %如果程式有異常,輸出
end
