2015-09-10 96 views
1

我用C實現了一個2D中值濾波器。對於大小爲1440X1440的圖像,浮點值。爲了開始,我嘗試了一個簡單的3X3內核大小。這是代碼。現在中值濾波器實現測試

#define  kernelSize  3 

void sort(float *array2sort, int n) 
{ 
    float  temp; 
    for(int i=0; i < n-1; i++) 
     for(int j=0; j < n-1-i; j++) 
      if(array2sort[j] > array2sort[j+1]) 
      { 
       temp = array2sort[j]; 
       array2sort[j] = array2sort[j+1]; 
       array2sort[j+1] = temp; 
      } 
} 


void medianFilter(float *input, float *output) 
{ 
    int  halfKernelSize = kernelSize/2; 

    float neighbourhood[kernelSize*kernelSize]; 

    for(int i=0+halfKernelSize; i<(1440-halfKernelSize); i++) 
     for(int j=0+halfKernelSize; j<(1440-halfKernelSize); j++) 
     { 
      for(int ii=-halfKernelSize; ii<halfKernelSize+1; ii++) 
       for(int jj=-halfKernelSize; jj<halfKernelSize+1; jj++) 
        neighbourhood[(ii+halfKernelSize)*kernelSize+(jj+halfKernelSize)] = input[(i+ii)*1440+(j+jj)]; 
      sort(neighbourhood, kernelSize*kernelSize); 
      output[(i)*1440+(j)] = neighbourhood[(kernelSize*kernelSize)/2+1]; 
     } 

} 

,以驗證該代碼是好的,我把圖像,使用MATLAB加鹽&椒鹽噪聲它。然後嘗試上面的代碼。我幾乎可以看到噪音幾乎完全減少了幾個點。如果我將內核大小增加到5X5,則噪聲會完全過濾。但令我擔憂的是,即使使用3X3的內核,MATLAB的中值濾波器代碼也能夠完全消除噪聲。這讓我懷疑。請看看代碼,並告訴我是否在過濾器實現中存在某些錯誤,或者MATLAB代碼正在採取一些額外的步驟。

+0

現在,爲了驗證代碼是否正常,我拍攝了一張圖像,使用MATLAB爲其添加了鹽和胡椒噪聲。然後嘗試上面的代碼。我幾乎可以看到噪音幾乎完全減少了幾個點。如果我將內核大小增加到5X5,則噪聲會完全過濾。但令我擔憂的是,即使使用3X3的內核,MATLAB的中值濾波器代碼也能夠完全消除噪聲。請看看代碼,並告訴我是否在過濾器實現中存在某些錯誤,或者MATLAB代碼正在採取一些額外的步驟。 –

+0

請勿添加重要信息或您在評論中嘗試過的內容,請*編輯您的問題*。 –

+0

這就是我想知道編輯問題的選項在哪裏。 –

回答

0

我認爲從鄰居緩衝區計算的中值是錯誤的。 它應該是鄰域[(kernelSize * kernelSize)/ 2]。 你可以嘗試這個更正嗎?

+0

對於3X3內核,鄰域是大小爲9的數組(kernelSize * kernelSize)。排序後的中位數將是指數值5.這是= 9/2 + 1。 (9/2 = 4)。所以,我認爲這段代碼很好。 –

+0

我同意第五個值是中位數。但在C中,數組索引從0開始。因此,如果要訪問第5個元素,則必須使用array [4]。 –

+0

Thnx,現在效果很好。你指出錯誤正確。 –