Оптимизация циклов для обработки пикселей - PullRequest
2 голосов
/ 19 июля 2011

Я реализую алгоритм (в OpenCV), который перебирает каждый пиксель в изображении, и для каждого пикселя вычисляет совпадения блоков с соседними пикселями, чтобы оценить сходство этих соседних пикселей. «Наивная» реализация с очень глубокими циклами очень медленная, поэтому мне было интересно, как я могу попытаться улучшить производительность. Ниже приведен фрагмент моего текущего кода:

for(nCh=1;nCh<=channels;nCh++) { // Loop over three channels

  for(i=0;i<h;i++) { // "vertical" loop

    for(j=0;j<w;j++) { // "horizontal" loop

      for (si=-sw_height; si<sw_height; si++){ // vertical search window loop

        for (sj=-sw_width; sj<sw_width; sj++){ // horizontal search window loop

            dist = 0;

            for (blki=0; blki<blk_height; blki++){ // block match loop

              for (blkj=0; blkj<blk_width; blkj++){ // block match loop

                current_pxl = data[(i+blki)*step+(j+blkj)*channels+nCh];  

                search_pxl  = data[(i+blki+si)*step+(j+blkj+sj)*channels+nCh]; 

                dist += pow((current_pxl - search_pxl),2); 

              }

            }

          // ... further processing

        }

      }

    }

  }

}

1 Ответ

5 голосов
/ 19 июля 2011

Вы звоните pow в самом внутреннем цикле.Не.

Также вы делаете много расчета индекса там.Бьюсь об заклад, вы можете вывести некоторые из этого внутреннего цикла.

Вы должны быть в состоянии получить это так, что ваш внутренний цикл выглядит примерно так:даже хочу немного развернуть.

Кстати, немного больше пробелов может помочь: -)

...