home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / BarlaA / sw / OLD / Simo / SVM_mono / kernel_old.c < prev    next >
C/C++ Source or Header  |  2002-06-25  |  6KB  |  267 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "nrutil.h"
  5. #include "patt_rec.h"
  6.  
  7. extern int    dim;
  8. extern int    degree;
  9. extern double    sigma, normalization;
  10. extern int      dim_r,dim_c, delta_g, delta_r, delta_c;
  11.  
  12. double linear_kernel(double *v1, double *v2)
  13. {
  14.     register  i;
  15.     double aux = 0.;
  16.  
  17.     for (i = dim; i > 0; i--)
  18.         aux += *v1++ * *v2++;
  19. /*    fprintf(stderr, "%lf\n", aux/normalization);*/
  20.     return aux/normalization;
  21. }
  22.  
  23. double negative_kernel(double *v1, double *v2)
  24. {
  25.     register  i;
  26.     double aux = 0., tmp;
  27.  
  28.     
  29.     for (i = dim; i > 0; i--) {
  30.         tmp = *v1++ - *v2++;
  31.             aux -= tmp * tmp;
  32.       }
  33.     
  34.     /*
  35.     for (i=dim; i>0; i--) {
  36.       tmp = - (*v1)*(*v1) - (*v2)*(*v2) + 2*(*v1++)(*v2++);
  37.       aux += tmp;
  38.     }
  39.     */
  40.  
  41.  
  42.     return (aux/normalization);
  43. }
  44.  
  45. double poly_kernel(double *v1, double *v2)
  46. {
  47.     register  i;
  48.     double aux = 0.;
  49.     
  50.     for (i = dim; i > 0; i--)
  51.         aux += *v1++ * *v2++;
  52. /*    fprintf(stderr, "%lf\n", pow((aux/normalization + 1.),(double)degree)-1.);*/
  53.     return(pow((aux/normalization + 1.),(double)degree)-1.);
  54. }
  55.  
  56. double rbf_kernel(double *v1, double *v2)
  57. {
  58.     register  i;
  59.     double aux, res = 0.;
  60.     
  61.     for (i = dim; i > 0; i--)
  62.     {
  63.         aux = *v1++ - *v2++;
  64.         res += aux * aux;
  65.     }
  66. /*    fprintf(stderr, "%lf\n", exp(-res/(2*sigma*sigma)));*/
  67.     return exp(-res / (2*sigma*sigma));
  68. }
  69.  
  70. double mv_kernel(double *mod,double *imm)
  71. {
  72.   register i;
  73.   double normal_imm = 0.; 
  74.   double normal_mod = 0.; 
  75.   double mod2[dim],imm2[dim];    /*vettori ausiliarii*/
  76.   double inter = 0.;
  77.   
  78.   for(i=0; i<dim; i++){ 
  79.     //fprintf(stdout,"uffa %lf %lf \n",imm[i],mod[i]);
  80.     normal_imm += imm[i];
  81.     normal_mod += mod[i];
  82.   }
  83.   
  84.   //fprintf(stdout,"%lf %lf\n",normal_imm,normal_mod);
  85.   for(i=0; i<dim; i++){
  86.     imm2[i] = imm[i]/normal_imm;
  87.     mod2[i] = mod[i]/normal_mod;
  88.     inter +=  ilmiomin(imm2[i],mod2[i]);
  89.   }
  90.   
  91.   
  92.   return(inter); 
  93.  
  94.   
  95.  
  96. double haus_kernel(double *v1, double *v2)
  97. {
  98.    register int big_g;
  99.   int i,j,k,ii,jj,kk;
  100.   int max_val, counter, tmp_counter;
  101.   int st_k;
  102.   int check=0;
  103.  
  104.   int verbose, occlusion, max_noise;
  105.  
  106.   int type;
  107.   int w_r, w_c;
  108.   double *data_i, *model_data;
  109.   double *data_s, *base, *startp;
  110.   byte pop[ 256 ], *grey;
  111.  
  112.   double  *image_s;
  113.   long *addr,*next;
  114.   int **surface, **row_surface, **col_surface, **and,*buffer;
  115.  
  116.   long tot=0;
  117.   int start_h;
  118.   int stop_h;
  119.   int start_k;
  120.   int stop_k;
  121.  
  122.   model_data= v1; //model first
  123.   data_i = v2;    //image second
  124.  
  125.   w_r= dim_r;
  126.   w_c = dim_c;
  127.  
  128.   /* BEGIN initialization                 */
  129.  
  130.   for (i = 0; i < 256; i++)
  131.     pop[i] = 0;
  132.  
  133.   /*      pop[ ind ] is 1 if the grey value ind is present in the model     */
  134.  
  135.   for ( j = 0; j < w_r; j++ )
  136.     for ( k = 0; k < w_c; k++ ) 
  137.       {
  138.       pop[((byte) model_data[ j * dim_c + k ]) ] = 1;
  139.  
  140.     }
  141.  
  142.   /*  big_g will contain the number  of grey levels of the model          */
  143.  
  144.   big_g = 0;
  145.  
  146.   for (i = 0; i < 256; i++)
  147.     if (pop[ i ])
  148.       big_g++;
  149.  
  150.   grey = cvector(0, big_g - 1);
  151.  
  152.   j = 0;
  153.  
  154.   for (i = 0; i < 256; i++ )
  155.     if (pop[ i ] ) {
  156.       grey[ j ] = i;
  157.       pop[ i ]=j;
  158.       j++;
  159.     }
  160.  
  161.   /* addr is a buffer with as many elements as the model. Used to optimize the access to
  162.      the right element of the image data structure                                     */
  163.  
  164.   addr = lvector( 0, w_r*w_c );
  165.   for( i=0; i < w_r; i++ )
  166.     for( j=0; j < w_c; j++ ) {
  167.     addr[ i*w_c+j ] = pop[((byte)model_data[i*dim_c+j])]*dim_c*dim_r+i*dim_c+j;
  168.     }
  169.   addr[ w_c*w_r ]= -2;
  170.  
  171.  
  172.   data_s = dvector(0, big_g*dim_r*dim_c-1);
  173.   for(i=0;i<big_g*dim_r*dim_c-1;i++)
  174.     data_s[i]=0;
  175.  
  176. /* occhio allo sfondo = 180 */
  177.   for (j = 0; j < dim_r ; j++)
  178.     for (k = 0; k < dim_c; k++)
  179.        for (i = ((byte)data_i[j*dim_c+k]) -delta_g ; i <= ((byte)data_i[j*dim_c+k]) +delta_g ; i++)
  180.       for (jj = j - delta_r; jj <= j + delta_r; jj++)
  181.         for (kk = k - delta_c; kk <= k + delta_c; kk++) {
  182.           if ((i>=0)&&(i<256) &&(jj>=0)&&(jj<dim_r)&&(kk>=0)&&(kk<dim_c))
  183.         if (pop[i]!=0)
  184.           *(data_s+pop[i]*dim_c*dim_r+jj*dim_c+kk) = 1;
  185.       }
  186.  
  187.  
  188.   startp=data_s;
  189.   max_val = 0;
  190.  
  191.   counter=0;
  192.   next=addr;
  193.   base = startp;  //this command is equivalent to translating the model
  194.                               //along the image
  195.   for(;*next>=-1;) {
  196.  
  197.     if (*next!=-1) {
  198.       if (*(base+(*next++)))    //Jump in the right position of the image 3D structure
  199.                             //accessing the offsets stored in addr
  200.     counter++;              //Count the ones
  201.     }
  202.     else *next++;
  203.   }
  204.    
  205.  
  206.    free_dvector(data_s,0, big_g*dim_r*dim_c-1);
  207.    free_cvector(grey,0, big_g - 1);
  208.    free_lvector(addr, 0, w_r*w_c );
  209.  
  210.    /* AGGIUNTA SCOPIAZZAMENTO TIPI PROGETTO */
  211.    /* x e y sono le ccordinate del punto nell'immagine (i,j) */
  212.    
  213.    for(i=0;i<w_r;i++)//modello
  214.      for(j=0;j<w_c;j++){//immagine
  215.        start_h = (x-delta_c)+i;
  216.        stop_h  = (x+delta_c)+i;
  217.        start_k = (y-delta_r)+j;
  218.        stop_k  = (y+delta_r)+j;
  219.        for(h=start_h;h<stop_h;h++)
  220.      for(k=start_k;k<stop_k;k++){
  221.        
  222.        if ( abs((ActualImage->m_Matrix[h][k])-(ActualModel->m_Matrix[i][j])) <= epsilon ){
  223.          tot++;
  224.          h=stop_h;
  225.          k=stop_k;
  226.        }
  227.      }
  228.      }
  229.    return tot/(float)(m_w_r*m_w_c);
  230.    return((double)counter/normalization);
  231. }
  232.  
  233.  
  234.  
  235. static double (*kernel_v[])() = {linear_kernel, negative_kernel,poly_kernel, rbf_kernel, mv_kernel, haus_kernel};
  236.  
  237. double kernel(int k, double *v1, double *v2)
  238. {
  239.     switch (k)
  240.     {
  241.         case LINEAR_KERNEL:
  242.             return linear_kernel(v1, v2);
  243.         case NEGATIVE_KERNEL:
  244.             return negative_kernel(v1, v2);
  245.         case POLY_KERNEL:
  246.             return poly_kernel(v1, v2);
  247.         case RBF_KERNEL:
  248.             return rbf_kernel(v1, v2);
  249.         case MV_KERNEL:
  250.             return mv_kernel(v1, v2);
  251.         case HAUS_KERNEL:
  252.           {
  253.             return haus_kernel(v1, v2);
  254.           }
  255.                 case HAUS_KERNEL_SIMM:
  256.                   {
  257.                     return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
  258.                    }
  259.                 fprintf(stderr, "Unknown kernel\n");
  260.             exit(-1);
  261.     }
  262.     return (*kernel_v[k])(v1, v2);
  263. }
  264.  
  265.  
  266.