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 >
Wrap
C/C++ Source or Header
|
2002-06-25
|
6KB
|
267 lines
#include <math.h>
#include <stdio.h>
#include <string.h>
#include "nrutil.h"
#include "patt_rec.h"
extern int dim;
extern int degree;
extern double sigma, normalization;
extern int dim_r,dim_c, delta_g, delta_r, delta_c;
double linear_kernel(double *v1, double *v2)
{
register i;
double aux = 0.;
for (i = dim; i > 0; i--)
aux += *v1++ * *v2++;
/* fprintf(stderr, "%lf\n", aux/normalization);*/
return aux/normalization;
}
double negative_kernel(double *v1, double *v2)
{
register i;
double aux = 0., tmp;
for (i = dim; i > 0; i--) {
tmp = *v1++ - *v2++;
aux -= tmp * tmp;
}
/*
for (i=dim; i>0; i--) {
tmp = - (*v1)*(*v1) - (*v2)*(*v2) + 2*(*v1++)(*v2++);
aux += tmp;
}
*/
return (aux/normalization);
}
double poly_kernel(double *v1, double *v2)
{
register i;
double aux = 0.;
for (i = dim; i > 0; i--)
aux += *v1++ * *v2++;
/* fprintf(stderr, "%lf\n", pow((aux/normalization + 1.),(double)degree)-1.);*/
return(pow((aux/normalization + 1.),(double)degree)-1.);
}
double rbf_kernel(double *v1, double *v2)
{
register i;
double aux, res = 0.;
for (i = dim; i > 0; i--)
{
aux = *v1++ - *v2++;
res += aux * aux;
}
/* fprintf(stderr, "%lf\n", exp(-res/(2*sigma*sigma)));*/
return exp(-res / (2*sigma*sigma));
}
double mv_kernel(double *mod,double *imm)
{
register i;
double normal_imm = 0.;
double normal_mod = 0.;
double mod2[dim],imm2[dim]; /*vettori ausiliarii*/
double inter = 0.;
for(i=0; i<dim; i++){
//fprintf(stdout,"uffa %lf %lf \n",imm[i],mod[i]);
normal_imm += imm[i];
normal_mod += mod[i];
}
//fprintf(stdout,"%lf %lf\n",normal_imm,normal_mod);
for(i=0; i<dim; i++){
imm2[i] = imm[i]/normal_imm;
mod2[i] = mod[i]/normal_mod;
inter += ilmiomin(imm2[i],mod2[i]);
}
return(inter);
}
double haus_kernel(double *v1, double *v2)
{
register int big_g;
int i,j,k,ii,jj,kk;
int max_val, counter, tmp_counter;
int st_k;
int check=0;
int verbose, occlusion, max_noise;
int type;
int w_r, w_c;
double *data_i, *model_data;
double *data_s, *base, *startp;
byte pop[ 256 ], *grey;
double *image_s;
long *addr,*next;
int **surface, **row_surface, **col_surface, **and,*buffer;
long tot=0;
int start_h;
int stop_h;
int start_k;
int stop_k;
model_data= v1; //model first
data_i = v2; //image second
w_r= dim_r;
w_c = dim_c;
/* BEGIN initialization */
for (i = 0; i < 256; i++)
pop[i] = 0;
/* pop[ ind ] is 1 if the grey value ind is present in the model */
for ( j = 0; j < w_r; j++ )
for ( k = 0; k < w_c; k++ )
{
pop[((byte) model_data[ j * dim_c + k ]) ] = 1;
}
/* big_g will contain the number of grey levels of the model */
big_g = 0;
for (i = 0; i < 256; i++)
if (pop[ i ])
big_g++;
grey = cvector(0, big_g - 1);
j = 0;
for (i = 0; i < 256; i++ )
if (pop[ i ] ) {
grey[ j ] = i;
pop[ i ]=j;
j++;
}
/* addr is a buffer with as many elements as the model. Used to optimize the access to
the right element of the image data structure */
addr = lvector( 0, w_r*w_c );
for( i=0; i < w_r; i++ )
for( j=0; j < w_c; j++ ) {
addr[ i*w_c+j ] = pop[((byte)model_data[i*dim_c+j])]*dim_c*dim_r+i*dim_c+j;
}
addr[ w_c*w_r ]= -2;
data_s = dvector(0, big_g*dim_r*dim_c-1);
for(i=0;i<big_g*dim_r*dim_c-1;i++)
data_s[i]=0;
/* occhio allo sfondo = 180 */
for (j = 0; j < dim_r ; j++)
for (k = 0; k < dim_c; k++)
for (i = ((byte)data_i[j*dim_c+k]) -delta_g ; i <= ((byte)data_i[j*dim_c+k]) +delta_g ; i++)
for (jj = j - delta_r; jj <= j + delta_r; jj++)
for (kk = k - delta_c; kk <= k + delta_c; kk++) {
if ((i>=0)&&(i<256) &&(jj>=0)&&(jj<dim_r)&&(kk>=0)&&(kk<dim_c))
if (pop[i]!=0)
*(data_s+pop[i]*dim_c*dim_r+jj*dim_c+kk) = 1;
}
startp=data_s;
max_val = 0;
counter=0;
next=addr;
base = startp; //this command is equivalent to translating the model
//along the image
for(;*next>=-1;) {
if (*next!=-1) {
if (*(base+(*next++))) //Jump in the right position of the image 3D structure
//accessing the offsets stored in addr
counter++; //Count the ones
}
else *next++;
}
free_dvector(data_s,0, big_g*dim_r*dim_c-1);
free_cvector(grey,0, big_g - 1);
free_lvector(addr, 0, w_r*w_c );
/* AGGIUNTA SCOPIAZZAMENTO TIPI PROGETTO */
/* x e y sono le ccordinate del punto nell'immagine (i,j) */
for(i=0;i<w_r;i++)//modello
for(j=0;j<w_c;j++){//immagine
start_h = (x-delta_c)+i;
stop_h = (x+delta_c)+i;
start_k = (y-delta_r)+j;
stop_k = (y+delta_r)+j;
for(h=start_h;h<stop_h;h++)
for(k=start_k;k<stop_k;k++){
if ( abs((ActualImage->m_Matrix[h][k])-(ActualModel->m_Matrix[i][j])) <= epsilon ){
tot++;
h=stop_h;
k=stop_k;
}
}
}
return tot/(float)(m_w_r*m_w_c);
return((double)counter/normalization);
}
static double (*kernel_v[])() = {linear_kernel, negative_kernel,poly_kernel, rbf_kernel, mv_kernel, haus_kernel};
double kernel(int k, double *v1, double *v2)
{
switch (k)
{
case LINEAR_KERNEL:
return linear_kernel(v1, v2);
case NEGATIVE_KERNEL:
return negative_kernel(v1, v2);
case POLY_KERNEL:
return poly_kernel(v1, v2);
case RBF_KERNEL:
return rbf_kernel(v1, v2);
case MV_KERNEL:
return mv_kernel(v1, v2);
case HAUS_KERNEL:
{
return haus_kernel(v1, v2);
}
case HAUS_KERNEL_SIMM:
{
return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
}
fprintf(stderr, "Unknown kernel\n");
exit(-1);
}
return (*kernel_v[k])(v1, v2);
}