2015-06-24 140 views
3

我寫過3x3的平均濾波器。它工作正常,但它顯示三次相同的輸出圖像,而不是一個。如何解決問題?平均濾波器Matlab

的代碼是提前

function [filtr_image] = avgFilter(noisy_image) 

    [x,y] = size(noisy_image); 
    filtr_image = zeros(x,y); 
    for i = 2:x-1 
     for j =2:y-1 
      sum = 0; 
      for k = i-1:i+1 
       for l = j-1:j+1 
        sum = sum+noisy_image(k,l); 
       end 
      end 
      filtr_image(i,j) = sum/9.0; 
      filtr_image = uint8(filtr_image); 

     end 
    end 

end 

感謝

+1

http://stackoverflow.com/questions/13445334/3x3-average-filter-in-matlab?rq=1 – dasdingonesin

+1

是您的圖像**顏色**或**灰度**?此代碼假定您的圖像是灰度。 – rayryeng

回答

1

我不明白爲什麼你的代碼會重複圖像(除非它是由一個整數溢出的模式原因:/),但這裏有一些建議:

如果要使用循環,至少降內環

[x,y] = size(noisy_image); 
filtr_image = zeros(x,y); 
for i = 2:x-1 
    for j =2:y-1 
     % // you could do this in 1 line if you use mean2(...) instead 
     sub = noisy_image(i-1:i+1, j-1:j+1); 
     filtr_image = uint8(mean(sub(:))); 
    end 
end 

但是你知道卷積嗎? MATLAB有一個內置的功能是:

filter = ones(3)/9; 
filtr_image = uint8(conv2(noisy_image, filter, 'same')); 
1

什麼是最有可能發生的事情是,你提供一個彩色圖像時的代碼是專指灰度的事實。讓我們從這個教訓中盲目地從源代碼中複製代碼,而不是首先完全理解代碼。

爲什麼你看到的「三」是因爲當你這樣做來分配你的輸出濾波圖像的原因:如果你有一個三維矩陣

[x,y] = size(noisy_image) 

,通過size報告列數將是y = size(noisy_image,2)*size(noisy_image,3);。因此,當您迭代圖像中的每個像素時,按列主要順序,每個平面將彼此並排放置。你應該做的是要麼將您的圖像從RGB轉換爲灰度,要麼單獨過濾每個平面。

另外,您在循環中執行了不必要的轉換。只需在循環之外執行一次。

選項#1 - 每架飛機的篩選

function [filtr_image] = avgFilter(noisy_image) 
[x,y,z] = size(noisy_image); 
filtr_image = zeros(x,y,z,'uint8'); 
for a = 1 : z 
    for i = 2:x-1 
     for j =2:y-1 
      sum = 0; 
      for k = i-1:i+1 
       for l = j-1:j+1 
        sum = sum+noisy_image(k,l,a); 
       end 
      end 
      filtr_image(i,j,a) = sum/9.0; 
     end 
    end 
end 
end 

然後你會被稱之爲:

filtr_image = avgFilter(noisy_image); 

選項#2 - 轉換爲灰度

filtr_image = avgFilter(rgb2gray(noisy_image)); 

小注

您正在使用sum作爲一個變量。這是一個非常糟糕的選擇。 sum是MATLAB中的一個實際功能,你可能會用變量掩蓋這個函數。如果您有其他功能依賴sum進行後續操作,則會產生意想不到的後果。