Advertisement
Guest User

Eddy_Em

a guest
Aug 31st, 2011
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.29 KB | None | 0 0
  1. /*
  2.  * Медианная фильтрация
  3.  * однопоточная:
  4.  *      127секунд для 3Кх3К с фильтром 32х32
  5.  *      33секунды для 3Кх3К с фильтром 16x16
  6.  *      4.4секунды 3Кх3К с фильтром 5х5
  7.  * четырехпоточная:
  8.  *      1974секунды для 3Кх3К с фильтром 256x256
  9.  *      40секунд для 3Кх3К с фильтром 32х32
  10.  *      10секунд для 3Кх3К с фильтром 16x16
  11.  *      1.4секунды 3Кх3К с фильтром 5х5
  12.  * вход:
  13.  *      ima - изображение (free выполнять в вызвавшей программе)
  14.  *      f - фильтр
  15.  *      sizex, sizey - размеры изображения
  16.  * выход:
  17.  *      result - отфильтрованное изображение, память выделяется в этой процедуре
  18.  *              края изображения, не попавшие в фильтр (+- 1/2 размера фильтра),
  19.  *              заполняются нулями
  20.  */
  21. int MedFilter(float *ima __attribute__((unused)),
  22.                     float **result  __attribute__((unused)),
  23.                     Filter *f __attribute__((unused)),
  24.                     int sizex,
  25.                     int sizey
  26.                     ){
  27.     int xlow = f->w / 2, xhigh = f->w - xlow;// границы области фильтра [x0-xlow, x0+xhigh)
  28.     int ylow = f->h / 2, yhigh = f->h - ylow; // [y0-ylow, y0+yhigh)
  29.     int x, xm=sizex-xhigh, ym=sizey-yhigh; // xm,ym - верхние границы фильтруемого изображения
  30.     int ssize=sizex*sizey, fsz=f->w*f->h, H = f->h - 1;
  31.     #ifdef EBUG
  32.     double t0 = dtime();
  33.     #endif
  34.     *result = calloc(ssize, sizeof(float));
  35.     if(!result) return FALSE;
  36.     /*
  37.      * выбор элементов изображения по квадрату wxh в массив arr
  38.      * x0,y0 - координаты центра квадрата
  39.      * cntr - текущая заменяемая строка, либо -1, если необходимо заполнять arr целиком
  40.      * при cntr != -1 очередная строка заменяет строку cntr
  41.      */
  42.     float selarr(int x0, int y0, float *arr, int *cntr){
  43.         int x,y,tx,ty;
  44.         float *tmp, *ptr;
  45.         tx=x0+xhigh; ty=y0+yhigh;
  46.         if(*cntr==-1){ // начало очередного столбца
  47.             tmp = arr;
  48.             for(y=y0-ylow; y<ty; y++){ // полностью заполняем массив
  49.                 ptr = &ima[y*sizex+x0-xlow]; // ЗАПОЛНЯЕМ ПО СТРОКАМ!!!
  50.                 for(x=x0-xlow; x<tx; x++)
  51.                     *tmp++ = *ptr++;
  52.             }
  53.             *cntr=0; // в следующий раз заменяем первый столбец
  54.         }else{
  55.             tmp = &arr[*cntr*f->w]; // указатель на заменяемую строку
  56.             ptr = &ima[(ty-1)*sizex+x0-xlow];
  57.             for(x=x0-xlow; x<tx; x++) // заменяем данные в столбце
  58.                 *tmp++ = *ptr++;
  59.             if(++(*cntr) > H) *cntr = 0;
  60.         }
  61.         return quick_select(arr, fsz);
  62.     }
  63.     #pragma omp parallel
  64.     {
  65.         float *arr = calloc(fsz, sizeof(float)); // массив для хранения выборки
  66.         if(arr){
  67.         #pragma omp for
  68.         for(x = xlow; x < xm; x++){
  69.             int y, cntr = -1;
  70.             for(y = ylow; y < ym; y++){
  71.                 (*result)[y*sizex + x] = selarr(x,y, arr, &cntr);
  72.             }
  73.         }
  74.         free(arr);
  75.         }
  76.     }
  77.     DBG("time=%f\n", dtime()-t0);
  78.     return TRUE;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement