优化循环像素处理



我正在实现一种算法(在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
        }
      }
    }
  }
}

您在最内层循环中调用pow。没有。

你还做了很多索引计算。我打赌你可以从内循环中移出一些。

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

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

然后,你甚至可能想把它展开一点

顺便说一句,多一点空格可能会有帮助:-)

最新更新