我正在尝试使用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
中搜索它。