2016-12-23 125 views
0

我有實現Prewitt邊緣檢測的代碼。我需要做的只是使用一個緩衝區來實現它,這意味着我不會創建圖像副本,而是編輯原始圖像。所以如果我想改變像素值78,我不能把新的值,例如100,直到所有周圍的像素都具有讀取值78. Color values of the pixels。我已經試了一整天的數字出來,但不能,如果有人給我寫某種僞的,我會很感激Prewitt濾波器,邊緣檢測

void filter_serial_prewitt(int *inBuffer, int *outBuffer, int width, int height){ 
    for (int i = 1; i < width - 1; i ++) { 
    for (int j = 1; j < height - 1; j ++) { 
     int Fx = 0; 
     int Fy = 0; 
     int F = 0; 
     for (int m = -1; m <= 1; m++) { 
      for (int n = -1; n <= 1; n++) { 
       Fx += inBuffer[(j + n) * width + (i + m)] * n; 
       Fy += inBuffer[(j + n) * width + (i + m)] * m; 
      } 
     } 
      F = abs(Fx) + abs(Fy); 

      if (F < THRESHOLD){ 
       outBuffer[j * width + i] = 255; 
      } else{ 
       outBuffer[j * width + i] = 0; 
      } 
     } 
    } 
} 
+0

爲什麼只需要1個緩衝區就可以做到這一點?並非所有的圖像處理技術都可以在原地完成,而且如果您可以將它們分成多次(特別是某些類型的卷積),則許多效率更高。另一種方法是使用只有幾行長的緩衝區而不是整個第二個圖像。這是一個可接受的答案嗎? – user1118321

+0

@ user1118321嗯,我知道使用兩個緩衝區更容易,更好,但這是我的任務。只編輯原始圖像。那麼我可能需要一些緩衝區來保存這些值,直到它們可以取代原來的值,但正如我所說的,我不知道該怎麼做。如果改變了任何東西,我必須以串行和並行的方式進行。 –

回答

1

一件事要了解一個Prewitt算的是,它是分開的。 See the Wikipedia article瞭解詳情。

計算單個輸出行,需要執行以下操作(僞代碼):

int* buffer = malloc (sizeof(int) * width); 
for (int i = 0; i < width; i++) 
{ 
    // Do the vertical pass of the convolution of the first 3 rows into 
    // the buffer. 
    buffer [ i ] = vertical_convolve(inBuffer [ i ], vertical_kernel); 
} 

// Next, do the horizontal convolution of the first row. We need to 
// keep the previous value in a temp buffer while we work 
int temp0 = horizontal_convolve(buffer [ 0 ], horizontal_kernel); 
for (int i = 1; i < width; i++) 
{ 
    int temp1 = horizontal_convolve(buffer[ i ], horizontal_kernel); 
    inBuffer [ i - 1 ] = temp0; 
    temp0 = temp1; 
} 

這需要一個緩衝區,則1個像素高和圖像的寬度。

要在整個圖像上工作,需要將上述緩衝區中的2個保留在周圍,並且在計算第三行上的像素後,可以將圖像第一行的第一個像素替換爲第一個像素第一個緩衝區。然後您可以將新計算的值放入緩衝區。

因此,在這種情況下,您不會保留整個第二張圖片,但需要保留大約2個像素高的緩衝區,其寬度與圖像一樣寬。