优化像素处理的循环

时间:2011-07-18 21:00:59

标签: optimization image-processing opencv

我正在实现一种迭代图像中每个像素的算法(在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 个答案:

答案 0 :(得分:5)

你在最里面的循环中调用pow。不。

你也在那里进行大量的指数计算。 我打赌你可以从内圈中移出一些。

你应该能够得到它,所以你的内循环看起来更像是这样:

          for (blkj = 0; blkj < blk_width; blkj++, pc += channels, ps += channels){
            int diff = (*pc - *ps); 
            dist += (diff * diff); 
          }

然后,你甚至可能想要展开它。

顺便说一下,更多的空白可能会有所帮助: - )