2016-12-23 14 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

Одна вещь, чтобы знать о оператор Прюитт является то, что оно отделимо. 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 буферов высотой 1 пиксель, которые являются такими же широкими, как и изображение.