2012-11-06 106 views
1

我是成像處理的新手,我發現實施圖像平滑的一些困難。matlab圖像平滑與conv2

基本上,我有一個圖像A,我想用當地平均值代替所有像素。所以我定義了口罩M1 = ones(10)並使用

newImage = conv2(A, M1,'same') 

它工作正常。但在圖像A中,由於噪聲,完全沒有意義的像素,我不想將它們包含在平均值中。我該怎麼做,說有意義的像素是通過另一個掩模M2定義的?

我在圖像上做了一個簡單的循環。它工作但比conv2()慢。

for i = 1:self.row 
    for j = 1:self.col 
     if self.M2(i,j) % only treat meaningful pixels 
      A(i,j) = self.createAvgPhasor(i,j); 
     end 
    end 
end 

    function [s_avg]=createAvgPhasor(self,m,n) 
     % bound box along x 
     if m > self.rB 
      xl = m - self.rB; 
     else 
      xl = 1; 
     end 
     if m < self.row_rB 
      xu = m + self.rB; 
     else 
      xu = self.row; 
     end 
     % bound box along y 
     if n > self.rB 
      yl = n - self.rB; 
     else 
      yl = 1; 
     end 
     if n < self.col_rB 
      yu = n + self.rB; 
     else 
      yu = self.col; 
     end 
     M1 = false(self.row,self.col); 
     M1(xl:xu,yl:yu) = true; 
     msk = M1 & self.M2; 
     s_avg = mean(self.Phi(msk)); 
    end 

非常感謝您的幫助。

+0

所以問題是你想用無意義的像素做什麼?你是否想用平均值替換它們,但不包括它們的平均值?你想保持它們的方式,用黑色替換它們... – Ali

+0

我不在乎噪聲像素的值。最後它們可以設置爲0。在平均中排除它們是我想要的。 – nos

+0

好的,我更新了我的答案,希望這有助於, – Ali

回答

0

排除卷積中的壞點很容易。如果M2包含1爲要包括像素,以及那些你做不成0,那麼你只是這樣做:

newImage = conv2(A.*M2, M1,'same'); 

這可能足以滿足您的目的,但你必須決定正是你的意思是「平均」例如,假設您的籽粒ones(10),在結束時,你可能想要做這樣的事情:

npts = conv2(ones(size(A)).*M2, M1, 'same') 
newImage = newImage./npts 

即,實際上包含的像素數量將每個像素in the convolution for that pixel。

實際上,即使您以不同的方式加權不同點,上述方法也可能做正確的事情。但它確實取決於你想要做什麼。

0

一個快速解決方案是用總平均值替換蒙版像素中的所有值。

更精細的方法是將一個大的(非常大的)平滑濾波器(如你已經使用但較大的濾波器)與圖像進行卷積,並且只使用結果填充原始圖像中的遮罩像素,您對原始圖像中的蒙版像素具有合理的值,您可以像現在這樣使用卷積。