中值滤波器OpenMP优化

Median Filter OpenMP Optimization

本文关键字:优化 OpenMP 中值滤波器      更新时间:2023-10-16

我正在尝试使用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];
}

我的问题是:是否有任何额外的pragma参数,我可以使用,使它走得更快?我一直在尝试一些事情,但没有人增加算法的性能…我不知道。

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