使用MATLAB對圖像處理的幾種方法(上)


實驗一圖像的濾波處理

一、實驗目的

使用MATLAB處理圖像,掌握均值濾波器和加權均值濾波器的使用,對比兩種濾波器對圖像處理結果及系統自帶函數和自定義函數性能的比較,體會不同大小的掩模對圖像細節的影響。

二、實驗內容

    使用n=3,5,9的正方形均值濾波器和加權均值濾波器對圖像Fig1的濾波處理。觀察處理前后圖像效果,分析實驗結果和算法特點。 

三、實驗原理

1、均值濾波器(平滑線性濾波器):其響應是包含模板內像素平均值,低通濾波器。

R = (領域內所有點的值*對應點的掩模系數之和)/(掩模系數之和)

g(x,y)=1/nf(x,y)  n為該模板中包含當前像素在內的像素總個數

2、加權均值濾波器:加權均值濾波算法是一種有效的去除高斯噪聲的算法。

如果領域內掩模系數不等,則這個掩模叫加權平均。從權值上看每個像素的重要性不等,權值越大表明這個像素越重要。

R=(權值*對應像素灰度值所有之和)/(權值之和)

g(x,y)=w(s,t)f(x,y)/(∑∑w(s,t))  w為權值

四、實驗步驟

1、n=3正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理

    (1)MATLAB自帶均值濾波器函數

>> clear,close all                                  %清除所有

>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg');   %讀取圖像

>> imshow(I);                                    %顯示圖像

>> K1=filter2(fspecial('average',3),I)/255;              %使用均值濾波器處理

>> figure,imshow(K1);                             %顯示處理結果

2、n=5正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理

   (1)MATLAB自帶均值濾波器函數

>> clear,close all                                  %清除所有

>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg');   %讀取圖像

>> imshow(I);                                    %顯示圖像

>> K1=filter2(fspecial('average',5),I)/255;              %使用均值濾波器處理

>> figure,imshow(K1);                             %顯示處理結果

3、n=9正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理

(1)MATLAB自帶均值濾波器函數

>> clear,close all                                  %清除所有

>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg');   %讀取圖像

>> imshow(I);                                    %顯示圖像

>> K1=filter2(fspecial('average',9),I)/255;              %使用均值濾波器處理

>> figure,imshow(K1);                             %顯示處理結果

4、使用自定義均值濾波函數處理

   源代碼:

% x是需要濾波的圖像,n是模板大小(n×n)   

function d=avg_filter(x,n)      

a(1:n,1:n)=1;   %an×n模板,元素全是1   

[height, width]=size(x);   %輸入圖像是height,width,height>n,width>n   

x1=double(x);   

x2=x1;   

for i=1:height-n+1     %等價於for i=n:height

    for j=1:width-n+1   

        c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的nn列元素與模板相乘   

        s=sum(sum(c));                 %c矩陣中各元素之和   

        x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將與模板運算后的各元素的均值賦給模板中心位置的元素   

    end   

end   

%未被賦值的元素取原值   

d=uint8(x2); 

5、使用加權均值濾波器對圖像Fig1的濾波處理

    若 I=[f(i,j)]M×表示輸入圖像其中 f(i,j)表示圖像灰度 值矩陣中(i,j)點處像素的灰度值。H3(i,j)代表像素中心在(i,j)大小為 3×的一個窗口 ,如下所示 

 

 

  

   加權濾波器的輸出:

 

該濾波器的具體實現步驟如下 :

(1)將模板H3(i,j)在圖像 I=[f(i,j)]M × N中從左到右、從上到下漫游,而模板中各位置點會與圖像中的某個像素點重合;

(2)讀取模板 H3(i,j)下各對應像素的灰度值 f(i,j);

(3)將這些灰度值 f(i,j)存儲在一維矩陣中,並進行比較,按升序排成一列;

(4)對這9個灰度從小到大依次與 w1w2w3w4w5w6w7w8w9相乘后相加得 A, 令 與各權重之和的倒數相乘,得列權值矩陣。

(6)將構成的權值矩陣與它所重合的像素灰度值相乘,把所有的乘積求和,將這個值賦給對應模板中心位置的像素。使灰度相近的鄰點參與平均的比重大,對模板中心 和較近的元素可以賦予大的加權值。

    源代碼:

% x是需要濾波的圖像,n是模板大小(n×n)   

function d=wavg_filter(x,n)        

[height, width]=size(x);   %輸入圖像是height,width,height>n,width>n   

x1=double(x);

new_image=ones(size(x1));

x2=x1;   

for i=2:height-n+1    %2開始,不能從1開始,因為這樣i-1=0了,x(0,1)這樣不可以的

    for j=2:width-n+1   

        %如果w1,w2……w9取相同的值的時候就是均值濾波器  n=3 3*3

        %H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]

        %x2(i,j)坐標

        %為了去除噪聲更多一些,w1-w9取值更均勻一些  

        %f1,f2,f3,f4,f5,f6,f7,f8,f9分別表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的權值

        %f=f1+f2+f3+f4+f5+f6+f7+f8+f9  表示權值之和

        %w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示權重

        %w=w1+w2+w3+w4+w5+w6+w7+w8+w9;  %權重之和為1;

        %加權均值濾波器 想要什么就把誰的權值加重        w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1; 

        A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;

        new_image(i,j)=A;        

        x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j);  %將與模板運算后的各元素的均值賦給模板中心位置的元素 

    end   

end   

%未被賦值的元素取原值   

d=uint8(x2);

五、實驗結果和分析

1、實驗結果:

(1)n=3均值濾波器

 

(2)n=5均值濾波器

 

(3)n=9均值濾波器

 

(4)自定義均值濾波器

 

(5)加權均值濾波器

 

2、結果分析:

1均值濾波器,平滑的效果和所采用領域的半徑(模板)有關,半徑越大,則圖像的模糊程度越大。

(2)加權均值濾波,需要提前設置權值,想要哪個像素點,就把哪個的權值加重。此外加權均值濾波器不能去掉噪聲,只能只是模糊和銳化。

(3)自定義的濾波器函數比系統自帶的函數性能高一些,這是經過多次試驗得出的結論。

六、實驗心得

   剛開始接觸MATLAB,那就是一頭霧水,找不到方向不知道從何處入手,后來查了一些資料和身邊一些從事這方面的同學朋友,才發現它原來是處理圖像的最好的工具。MATLAB中的函數的寫法類似C,但是和C還是不一樣的,比如在MATLAB中是從第1個開始的,沒有第0個的概念,如果你取值f(0,1),運行就會提示索引應該為正整數或者邏輯數。對於加權均值濾波器,權值不好取,需要根據一些計算和誤差分析等,需要大量實驗才能取得合適的值。接觸了幾天后,慢慢熟悉了,感覺MATLAB是一個好的工具,對於數學建模,數學中的一些計算,各種公式和函數的計算都很方便,最重要的是對處理圖像非常的好。現在圖像處理在人工智能,地理測繪,醫學成像等各個領域研究應用非常廣泛,使用它非常方便的,非常精細專業。 在我們現實生活中,我們了解了一個圖像實際上就是一個矩陣,每個像素點就是一個坐標,想讓某個模糊的地方復原就是讓它和它附件的區域取值一樣,把不同地方設置一樣的值就可以,對於彩色的照片我們可以設置灰度值變成黑白的。我們了解這些原理之后,可以對自己的照片進行處理,修復受損的照片和將彩色的照片變成黑白的,比PS好用多了。

 

實驗二多種濾波器的比較

一、實驗目的

使用MATLAB處理圖像,掌握各種濾波器的使用(例如:均值濾波器、加權均值濾波器、中值濾波器、高斯濾波器),對比各種濾波器對圖像處理結果,找出它們對各種噪聲(例如:椒鹽噪聲、高斯噪聲、脈沖噪聲)處理最佳。

二、實驗內容

使用均值濾波器、加權均值濾波器、中值濾波器、高斯濾波器對圖像Fig2的進行去除脈沖噪音處理。觀察對比這幾種濾波器對該圖像的結果,分析實驗結果和算法特點,找出一種最好的處理脈沖噪聲的濾波器或者算法。

三、實驗原理

1、均值濾波器(平滑線性濾波器):其響應是包含模板內像素平均值,低通濾波器。

R = (領域內所有點的值*對應點的掩模系數之和)/(掩模系數之和)

g(x,y)=1/nf(x,y)  n為該模板中包含當前像素在內的像素總個數

2、加權均值濾波器:加權均值濾波算法是一種有效的去除高  斯噪聲的算法。

如果領域內掩模系數不等,則這個掩模叫加權平均。從權值上看每個像素的重要性不等,權值越大表明這個像素越重要。

R=(權值*對應像素灰度值所有之和)/(權值之和)

g(x,y)=w(s,t)f(x,y)/(∑∑w(s,t))  w為權值

3、中值濾波器:用該像素鄰域內像素灰度的中值代替該像素的值。

F(x,y)=mid{g(s,t)}

中值濾波器對處理脈沖噪聲(黑白點)非常有效。

4、高斯濾波器:一種線性平滑濾波,適用於消除高斯噪聲,用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。

5、涉及到系統函數:

   Imread()讀取圖像,imshow()顯示圖像,doubleunit8用來處理圖像轉換為矩陣之后數據和顯示,size輸出圖像高和寬,floor()計算中心點,fspecial()生成系統濾波,filter2()

均值濾波,medfilt2()中值濾波

   filter_avg_3x3 = [1 1 1; 

                      1 1 1; 

                      1 1 1];

    filter_avg_5x5 = [1 1 1 1 1; 

                      1 1 1 1 1; 

                      1 1 1 1 1; 

                      1 1 1 1 1; 

                      1 1 1 1 1];

    filter_avg_9x9 = [1 1 1 1 1 1 1 1 1; 

                      1 1 1 1 1 1 1 1 1; 

                      1 1 1 1 1 1 1 1 1; 

                      1 1 1 1 1 1 1 1 1; 

                      1 1 1 1 1 1 1 1 1;

                      1 1 1 1 1 1 1 1 1;

                      1 1 1 1 1 1 1 1 1;

                      1 1 1 1 1 1 1 1 1;

                      1 1 1 1 1 1 1 1 1 ];            

    filter_w_avg_3x3 = [1 2 1; 

                        2 4 2; 

                        1 2 1];

    filter_w_avg_5x5 = [1 2 4 2 1; 

                        2 4 16 4 2;

                        4 16 256 16 2;

                        2 4 16 6 2;

                        1 2 4 2 1];

四、實驗步驟

1、使用均值濾波器處理圖像Fig2

源代碼:根據算法自定義函數

% x是需要濾波的圖像,n是模板大小(n×n)   

function d=avg_filter(x,n)      

a(1:n,1:n)=1;   %an×n模板,元素全是1   

[height, width]=size(x);  %輸入圖像是height,width,height>n,width>n   

x1=double(x);   

x2=x1;   

for i=1:height-n+1     %等價於for i=n:height

    for j=1:width-n+1   

        c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的nn列元素與模板相乘   

        s=sum(sum(c));                 %c矩陣中各元素之和   

        x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將與模板運算后的各元素的均值賦給模板中心位置的元素   

    end   

end   

%未被賦值的元素取原值   

d=uint8(x2);

2、使用加權均值濾波器處理圖像Fig2

源代碼:根據算法自定義函數

% x是需要濾波的圖像,n是模板大小(n×n)   

function d=wavg_filter(x,n)        

[height, width]=size(x);   %輸入圖像是height,width,height>n,width>n   

x1=double(x);

new_image=ones(size(x1));

x2=x1;   

for i=2:height-n+1    %2開始,不能從1開始,因為這樣i-1=0了,x(0,1)這樣不可以的

    for j=2:width-n+1   

        %如果w1,w2……w9取相同的值的時候就是均值濾波器  n=3 3*3

        %H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]

        %為了去除噪聲更多一些,w1-w9取值更均勻一些  

        %f1,f2,f3,f4,f5,f6,f7,f8,f9分別表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的權值

        %f=f1+f2+f3+f4+f5+f6+f7+f8+f9  表示權值之和

        %w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示權重

        %w=w1+w2+w3+w4+w5+w6+w7+w8+w9;  %權重之和為1;

        %加權均值濾波器 想要什么就把誰的權值加重

 w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1; 

        A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;

        new_image(i,j)=A;        

        x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j);  %將與模板運算后的各元素的均值賦給模板中心位置的元素 

    end   

end   

%未被賦值的元素取原值   

d=uint8(x2); 

3、使用中值濾波器處理圖像Fig2

源代碼:根據算法自定義函數

%自編的中值濾波函數。x是需要濾波的圖像,n是模板大小(n×n)   

function d=mid_filter(x,n)      

[height, width]=size(x);   %輸入圖像是p×q,p>n,q>n   

x1=double(x);   

x2=x1;   

for i=1:height-n+1   

    for j=1:height-n+1   

        c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中從(i,j)開始的nn列元素,即模板(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);

4、使用高斯濾波器處理圖像Fig2

源代碼:根據算法自定義函數

%自編的高斯濾波函數,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);

五、實驗結果和分析

該圖像對應的直方圖和轉換為矩陣的部分片段:

 

 

1、實驗結果:

(1)均值濾波器處理結果:

 

(2)加權均值濾波器處理結果:

 

(3)中值濾波器處理結果:

 

(4)高斯濾波器處理結果:

 

2、結果分析:

(1)模板越大,處理越模糊;

(2)幾種濾波器處理結果對比,中值濾波器對處理脈沖噪聲(黑白點)非常有效;

(3)線性濾波器對處理高斯噪聲效果很好,但是對椒鹽噪聲、脈沖噪聲效果一般,它的主要問題是有可能模糊圖像中的尖銳,不連續的部分。非線性濾波器,對濾出脈沖噪聲的效果最好。 

六、實驗心得

處理圖像,MATLAB中給的函數處理不能滿足需求,需要對已有的算法進行修改,找到一個適合的最佳的算法。很多算法都是需要進行多次試驗,記錄每次試驗的結果,對結果進行分析,找到合適的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM