Advertisement
Guest User

eddy

a guest
Jul 23rd, 2010
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.34 KB | None | 0 0
  1. #include "wavedec.h"
  2. #include "events.h"
  3. #include "macros.h"
  4. #include "alloc.h"
  5. #include "wav_filters.h"
  6. #include "wav_trf.h"
  7. #include "wav_gen.h"
  8.  
  9. float **imageR = NULL, **imageG = NULL, **imageB = NULL;
  10. float min_, max_, QMax[2][2], QMin[2][2], Widths[2][2], Areas[2][2];
  11. int wImageSize;
  12. GLubyte *WaveletBits = NULL;
  13. int more_info = 0;
  14.  
  15. void alloc_mem(){
  16.     int size, i, j;
  17.     if(imageR) free_2d_float(imageR, wImageSize);
  18.     if(imageG) free_2d_float(imageG, wImageSize);
  19.     if(imageB) free_2d_float(imageB, wImageSize);
  20. //  if(WaveletBits) free(WaveletBits);
  21.     wImageSize = (GRAB_WIDTH > GRAB_HEIGHT) ? GRAB_WIDTH : GRAB_HEIGHT;
  22.     i = 0; j = wImageSize;
  23.     while(j>>=1) i++; // получаем ближайшую к wImageSize степень 2 снизу
  24.     if(wImageSize != 1<<i) wImageSize = 1<<(i+1);
  25.     size = wImageSize * wImageSize;
  26.     imageR = allocate_2d_float(wImageSize, wImageSize, 1);
  27.     imageG = allocate_2d_float(wImageSize, wImageSize, 1);
  28.     imageB = allocate_2d_float(wImageSize, wImageSize, 1);
  29.     if(!WaveletBits) WaveletBits = (GLubyte *)calloc(3*size, sizeof(GLubyte));
  30. //  WARN("init memory for wavelets, ext size=%d\n", wImageSize);   
  31. }
  32. /*
  33. void emptyMem(){
  34.     int i,j;
  35.     for(i=0; i<wImageSize; i++)
  36.         for(j=0; j<wImageSize; j++)
  37.             imageR[j][i]=imageG[j][i]=imageB[j][i] = 0.;
  38. }*/
  39.  
  40. void initWavelet(){ // инициализация вейвлет-пространства и изображения для в.анализа
  41.     int i, j, k;
  42.     float *ptr[3];
  43. //  if(!(WaveletBits && imageR && imageG && imageB))
  44.         alloc_mem();
  45. //  emptyMem();
  46.     GLubyte *bytes = BitmapBits;
  47.     for(j = wImageSize - GRAB_HEIGHT; j < wImageSize; j++){
  48.         ptr[0] = imageR[j]; ptr[1] = imageG[j]; ptr[2] = imageB[j];
  49.         for(i = 0; i < GRAB_WIDTH; i++){
  50.             for(k = 0; k < 3; k++)
  51.                 *(ptr[k]++) = (float)(*bytes++);
  52.         }
  53.     }
  54. /*  fprintf(stderr, "Массив для вейвлетов инициализирован. размеры: %dx%d (увелич.: %d)\n",
  55.         GRAB_WIDTH, GRAB_HEIGHT, wImageSize);*/
  56. }
  57.  
  58. void mkWavedec(){
  59.     float *ptr[3],  wdth;
  60.     int j, i, k;
  61.     const int levs=1;
  62.     int Nl,Nh;
  63.     float *lp,*hp;
  64.     int shift_arr_r[MAX_ARR_SIZE],shift_arr_c[MAX_ARR_SIZE];
  65.     GLubyte *bytes;
  66.     inline void findminmax(float **image, char flag){
  67.         int w2 = GRAB_WIDTH/2-1, h2 = GRAB_HEIGHT/2-1, s2 = wImageSize/2;
  68.         int XLb = w2, XHb = s2+w2, YLb = h2, YHb = s2+h2;
  69.         int i, j, px, py;
  70.         float *ptr, pixval;
  71.         if(flag){
  72.             min_ = 1e30; max_ = -1e30;
  73.             for(i=0; i<2; i++) for(j=0; j<2; j++){
  74.                 QMax[i][j] = -1e30; QMin[i][j] = 1e30;
  75.                 Areas[i][j] = 0.;
  76.             }
  77.         }
  78.         for(j=0; j<YHb; j++){
  79.             if(j < YLb) py = 1;
  80.             else if(j > s2) py = 0;
  81.             else continue;
  82.             ptr = &image[j][1];
  83.             for(i=1; i<XHb; i++, ptr++){
  84.                 if(i < XLb) px = 0;
  85.                 else if(i > s2) px = 1;
  86.                 else continue;
  87.                 pixval = *ptr;
  88.                 if(min_ > pixval) min_ = pixval;
  89.                 else if(max_ < pixval) max_ = pixval;
  90.                 if(QMin[py][px] > pixval) QMin[py][px] = pixval;
  91.                 else if(QMax[py][px] < pixval) QMax[py][px] = pixval;
  92.                 Areas[py][px] += fabs(pixval);
  93.             }
  94.         }
  95.     }
  96.     inline GLubyte testpix(int pix){
  97.         int res = pix; if(res < 0) res = 0; else if(res > 255) res = 255;
  98.         return (GLubyte)res;
  99.     }
  100.     initWavelet();
  101.     for(i=levs-1; i>=0; i--)
  102.         shift_arr_r[i]=shift_arr_c[i]=0;
  103.     choose_filter('H', 9);
  104.     lp=MFLP;Nl=Nflp;  
  105.     hp=MFHP;Nh=Nfhp;
  106.     wav2d_inpl(imageR,wImageSize,wImageSize,levs,lp,Nl,hp,Nh,1,shift_arr_r,shift_arr_c);
  107.     wav2d_inpl(imageG,wImageSize,wImageSize,levs,lp,Nl,hp,Nh,1,shift_arr_r,shift_arr_c);
  108.     wav2d_inpl(imageB,wImageSize,wImageSize,levs,lp,Nl,hp,Nh,1,shift_arr_r,shift_arr_c);
  109.     findminmax(imageR, 1);
  110.     findminmax(imageG, 0);
  111.     findminmax(imageB, 0);
  112.     wdth = 255. / (max_ - min_);
  113.     bytes = WaveletBits;
  114.     for(j = 0; j < wImageSize; j++){
  115.         ptr[0] = imageR[j]; ptr[1] = imageG[j]; ptr[2] = imageB[j];
  116.         for(i = 0; i < wImageSize; i++){
  117.             for(k = 0; k < 3; k++)
  118.                 *bytes++ = (GLubyte) ((*(ptr[k]++) - min_) * wdth);
  119.         }
  120.     }
  121.     for(j=0; j<2; j++) for(i=0; i<2; i++)
  122.         Widths[j][i] = QMax[j][i] - QMin[j][i];
  123.     if(!more_info) return;
  124.     fprintf(stderr, "max=%.3g, min=%.3g\n", max_, min_);
  125.     fprintf(stderr, "Экстремумы по квадрантам (min, max):\n");
  126.     fprintf(stderr, "(%.3g, %.3g)\t\t\t(%.3g, %.3g)\n", QMin[0][0], QMax[0][0],
  127.         QMin[0][1], QMax[0][1]);
  128.     fprintf(stderr, "(%.3g, %.3g)\t\t\t(%.3g, %.3g)\n", QMin[1][0], QMax[1][0],
  129.         QMin[1][1], QMax[1][1]);
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement