【问题标题】:Optimising loops for pixel processing优化像素处理循环
【发布时间】:2011-07-19 05:36:25
【问题描述】:

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

        }

      }

    }

  }

}

标签: optimization image-processing opencv


【解决方案1】:

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

您还在那里进行了大量的索引计算。 我敢打赌,您可以将一些内容移出内部循环。

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

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

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

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

【讨论】:

  • 具体将 pow(x,2) 替换为 (x*x)。你会认为编译器会为你做这个替换,但由于我不会在这里讨论的原因,它通常不会。
  • 感谢 Mike 的建议,我会尝试一下,特别是移动一些索引。 @Mark 那很有趣,我会假设替换也会发生。我正在使用 gcc 4.5.2
  • @trican:它无法知道pow 没有被完全不同的东西取代。当编译器充分利用寄存器等时,我喜欢它,但我从不依赖来做我自己可以做的事情。
  • 哇,只需将 pow(x,2) 替换为 x*x 即可将运行时间缩短 75%!继续改进地址索引... :-)
  • @Mike,我想知道您能否详细说明您在上面输入的代码段。它看起来确实很有趣,但我不明白,可能主要是因为我从未见过这样的 for 循环中的更新语句。
猜你喜欢
  • 2022-06-13
  • 2021-05-04
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多