电竞比分网-中国电竞赛事及体育赛事平台

分享

發(fā)個(gè)MatLab?自編的?均值濾波、中值濾波、高斯濾波?圖

 unununy 2010-03-31

發(fā)個(gè)MatLab 自編的 均值濾波、中值濾波、高斯濾波 圖

(2010-03-07 19:51:26)
標(biāo)簽:

雜談

雖然matlab里面有這些函數(shù),但是攀立民老師要求自己編寫,計(jì)算機(jī)視覺上有這個(gè)實(shí)驗(yàn),到網(wǎng)上找了半天才零散的找到一些碎片,還是整理以后發(fā)上來吧!

MatLab自編的均值濾波、中值濾波、高斯濾波 圖像處理函數(shù)。

%自編的均值濾波函數(shù)。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);

%自編的中值濾波函數(shù)。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矩陣變?yōu)橐粋€(gè)行矩陣   
        end
        mm=median(e);      %mm是中值
        x2(i+(n-1)/2,j+(n-1)/2)=mm;   %將模板各元素的中值賦給模板中心位置的元素
    end
end
%未被賦值的元素取原值
d=uint8(x2);

 

%自編的高斯濾波函數(shù),S是需要濾波的圖象,n是均值,k是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%計(jì)算圖象中心
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'); %用生成的高斯序列卷積運(yùn)算,進(jìn)行高斯濾波
d=uint8(Img1);

 

 

%此為程序主文件,包含主要功能單元,以及對(duì)子函數(shù)進(jìn)行調(diào)用
try
%實(shí)驗(yàn)步驟一:彩色、灰度變換
h=imread('photo.jpg'); %讀入彩色圖片
c=rgb2gray(h); %把彩色圖片轉(zhuǎn)化成灰度圖片,256級(jí)
figure,imshow(c),title('原始圖象'); %顯示原始圖象
g=imnoise(c,'gaussian',0.1,0.002);  %加入高斯噪聲
figure,imshow(g),title('加入高斯噪聲之后的圖象');  %顯示加入高斯噪聲之后的圖象

%實(shí)驗(yàn)步驟二:用系統(tǒng)預(yù)定義濾波器進(jìn)行均值濾波
n=input('請(qǐng)輸入均值濾波器模板大小\n');
A=fspecial('average',n);  %生成系統(tǒng)預(yù)定義的3X3濾波器
Y=filter2(A,g)/255;           %用生成的濾波器進(jìn)行濾波,并歸一化
figure,imshow(Y),title('用系統(tǒng)函數(shù)進(jìn)行均值濾波后的結(jié)果'); %顯示濾波后的圖象

%實(shí)驗(yàn)步驟三:用自己的編寫的函數(shù)進(jìn)行均值濾波
Y2=avefilt(g,n);     %調(diào)用自編函數(shù)進(jìn)行均值濾波,n為模板大小
figure,imshow(Y2),title('用自己的編寫的函數(shù)進(jìn)行均值濾波之后的結(jié)果'); %顯示濾波后的圖象

%實(shí)驗(yàn)步驟四:用Matlab系統(tǒng)函數(shù)進(jìn)行中值濾波
n2=input('請(qǐng)輸入中值濾波的模板的大小\n');
Y3=medfilt2(g,[n2 n2]);   %調(diào)用系統(tǒng)函數(shù)進(jìn)行中值濾波,n2為模板大小
figure,imshow(Y3),title('用Matlab系統(tǒng)函數(shù)進(jìn)行中值濾波之后的結(jié)果');  %顯示濾波后的圖象

%實(shí)驗(yàn)步驟五:用自己的編寫的函數(shù)進(jìn)行中值濾波
Y4=midfilt(g,n2);      %調(diào)用自己編寫的函數(shù)進(jìn)行中值濾波,
figure,imshow(Y4),title('用自己編寫的函數(shù)進(jìn)行中值濾波之后的結(jié)果');

%實(shí)驗(yàn)步驟六:用matlab系統(tǒng)函數(shù)進(jìn)行高斯濾波
n3=input('請(qǐng)輸入高斯濾波器的均值\n');
k=input('請(qǐng)輸入高斯濾波器的方差\n');
A2=fspecial('gaussian',k,n3);      %生成高斯序列
Y5=filter2(A2,g)/255;              %用生成的高斯序列進(jìn)行濾波
figure,imshow(Y5),title('用Matlab函數(shù)進(jìn)行高斯濾波之后的結(jié)果');    %顯示濾波后的圖象

%實(shí)驗(yàn)步驟七:用自己編寫的函數(shù)進(jìn)行高斯濾波
Y6=gaussfilt(n3,k,g);  %調(diào)用自己編寫的函數(shù)進(jìn)行高斯濾波,n3為均值,k為方差
figure,imshow(Y6),title('用自編函數(shù)進(jìn)行高斯濾波之后的結(jié)果');      %顯示濾波后的圖象

catch           %捕獲異常
    disp(lasterr);     %如果程序有異常,輸出
end

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多