我正在尝试使用CImg库并行化中值过滤器。该代码看起来非常简单:

void omp_median_filter(CImg<float> & img) {
  CImg<float> copy(img);
  size_t i;
  #pragma omp parallel for schedule(dynamic)
  for (i = 1; i < img.width()-1; i++) {
    for (size_t j = 1; j < img.height()-1; j++) {
      for (size_t k = 0; k < img.spectrum(); k++) {
        img(i, j, k) = getNeighboursMedian(copy, i, j, k);
      }
    }
  }
}

在这种情况下,getNeighboursMedian函数无关紧要,但无论如何:
float getNeighboursMedian(CImg<float> & img, int i, int j, int k) {
  float neighbours[9];
  int kk = 0;
  for (size_t ii = i-1; ii <= i+1; ii++) {
    for (size_t jj = j-1; jj <= j+1; jj++) {
      neighbours[kk++] = img(ii,jj,k);
    }
  }
  sort(&neighbours[0], &neighbours[8]);
  return neighbours[4];
}

我的问题是:是否可以使用其他多余的实用指令来使其运行更快?我已经尝试了几件事,但是没人能提高算法的性能。

提前致谢。

最佳答案

也许您应该看看CImg方法CImg<T>::blur_median()的代码。它还使用openMP并行化实现中值滤波器。在文件CImg.h中搜索它。

10-06 15:32