Ejemplo n.º 1
0
static void
difference_of_gaussian(struct fmat_t *fm) {
        /* this kernel was generated by the gen-gaussian-kernel.py script */
#define KERNEL_A_SIZE 7
#define KERNEL_B_SIZE 13
        /* sigma = 1.0 */
        static const float kernel_a[] = {
                0.00443f, 0.05401f, 0.24204f,
                0.39905f,
                0.24204f, 0.05401f, 0.00443f,
        };
        
        /* sigma = 2.0 */
        static const float kernel_b[] = {
                0.00222f, 0.00877f, 0.02702f, 0.06482f, 0.12111f, 0.17621f,
                0.19968f,
                0.17621f, 0.12111f, 0.06482f, 0.02702f, 0.00877f, 0.00222f,
        }; 

        /* gaussian smoothing */
        struct fmat_t *fma = fmat_new(fm->w, fm->h);
        struct fmat_t *fmb = fmat_new(fm->w, fm->h);

        seperate_conv(fm, kernel_a, KERNEL_A_SIZE, fma);
        seperate_conv(fm, kernel_b, KERNEL_B_SIZE, fmb);

        fmat_sub(fma, fmb, fm);

        fmat_free(&fma);
        fmat_free(&fmb);
}
Ejemplo n.º 2
0
void
inorm(const struct image_t *src, struct image_t *dst) {
        struct fmat_t *fm = fmat_new(src->w, src->h);
        struct fmat_t *tfm = fmat_new(src->w, src->h);
        struct image_t *timg = image_new(src->w, src->h);
        
        gamma_correction(src, fm);
        difference_of_gaussian(fm);
        tanh_smooth(fm, tfm);
        rescale_to_image(tfm, dst);
        
        image_free(&timg);
        fmat_free(&fm);
        fmat_free(&tfm);
}
Ejemplo n.º 3
0
float *fmat_new_pca_part(int d,int n,int nev,
                         const float *v,float *singvals) {

  if(!(nev<=d && nev<=n)) {
    fprintf(stderr,"fmat_new_pca_part: asking for too many eigenvalues (%d) wrt %d*%d data\n",nev,n,d);
    return NULL;
  }


  float *pcamat=fmat_new(d,nev);  

  
  int ret;

  if(n>=d) {
    ret=fmat_svd_partial_full(d,n,nev,v,0,singvals,pcamat,NULL,count_cpu());
  } else {
    fprintf(stderr,"fmat_new_pca_part: warn fewer learning points (%d) than dimensions (%d): transposing\n",n,d);
    
    ret=fmat_svd_partial_full(n,d,nev,v,1,singvals,NULL,pcamat,count_cpu());
  }

  if(ret<0) {
    free(pcamat); 
    pcamat=NULL;
  }

  return pcamat;
}
Ejemplo n.º 4
0
static void 
seperate_conv(const struct fmat_t *fm, const float kernel[], unsigned int kernel_size, struct fmat_t *dst) {
	struct fmat_t *buf = fmat_new(fm->w, fm->h);
	sep_conv_h(fm->data, fm->w, fm->h, kernel, kernel_size, buf->data);
	sep_conv_v(buf->data, buf->w, buf->h, kernel, kernel_size, dst->data);
	fmat_free(&buf);
}
Ejemplo n.º 5
0
float *fmat_new_get_columns (const float *a, int nrow, int ncolout, const int *cols) {
  int i,j;
  float *b = fmat_new (nrow, ncolout);
  for(j=0;j<ncolout;j++)
    for(i=0;i<nrow;i++) 
      b[j*nrow+i]=a[i+nrow*cols[j]];
  return b;
}
Ejemplo n.º 6
0
float* fmat_new_mul_full(const float *left, const float *right,
                         int m, int n, int k,
                         const char *transp) {
  float *result=fmat_new(m,n);

  fmat_mul_full(left, right, m, n, k, transp, result);

  return result;
}
Ejemplo n.º 7
0
/*---------------------------------------------------------------------------*/
float *fmat_new_rand_gauss (int nrow, int ncol)
{
  long i;
  float *m = fmat_new (nrow, ncol);

  for (i = 0; i < nrow * ncol; i++)
    m[i] = gaussrand ();

  return m;
}
Ejemplo n.º 8
0
float *fmat_get_submatrix (const float *a, int nrow, 
                           int nrow_out,
                           int ncol) {
  long i;
  float *b=fmat_new(nrow_out,ncol);
  
  for(i=0;i<ncol;i++) 
    memcpy(b+i*nrow_out,a+i*nrow,nrow_out*sizeof(*a));

  return b;
}
Ejemplo n.º 9
0
float *fmat_new_get_rows (const float *a, int d, int n,                              
			  int nrowout, const int *rows) {
  float *b=fmat_new(nrowout,n);
  int i,j;
  int ii=0;
  for(j=0;j<n;j++) 
    for(i=0;i<nrowout;i++) 
      b[ii++]=a[rows[i]+d*j];
  
  return b;
}
Ejemplo n.º 10
0
float *fmat_new_get_rows (const float *a, int d, int n,                              
			  int nrowout, const int *rows) {
  float *b=fmat_new(nrowout,n);
  long i, j;
  long ii=0;
  for(j=0;j<n;j++) {
    const float *aj = a + d*(long)j;
    for(i=0;i<nrowout;i++) 
      b[ii++]=aj[rows[i]];
  }
  
  return b;
}
Ejemplo n.º 11
0
float *fmat_new_vstack(const float *a,int da,
                       const float *b,int db,
                       int n) {
  int i;
  float *c=fmat_new(da+db,n),*ret=c;
  for(i=0;i<n;i++) {
    memcpy(c,a,da*sizeof(float));
    c+=da;
    a+=da;
    memcpy(c,b,db*sizeof(float));
    c+=db;
    b+=db;
  }
  return ret;
}
Ejemplo n.º 12
0
int fmat_svd_partial_full(int n,int m,int nev,const float *a,int a_transposed,
                          float *s,float *vout,float *uout,int nt) {
  
  arpack_eigs_t *ae=arpack_eigs_begin(n,nev);
  if(!ae) return -100;
  int ret=0;
  
  int j,i;
  float *ax=NEWA(float,m);
  
  int it;

  for(it=0;;it++) {
    float *x,*y;
    ret=arpack_eigs_step(ae,&x,&y); 

    printf("arpack iteration %d ret=%d\r",it,ret);

    if(ret<0) break; /* error */

    if(ret==0) break; /* stop iteration */

    /* ret==1 */

    if(!a_transposed) {
      fmat_mul_v(m,n,a,n,x,ax,nt);
      fmat_mul_tv(n,m,a,n,ax,y,nt);
    } else {
      fmat_mul_tv(m,n,a,m,x,ax,nt);
      fmat_mul_v(n,m,a,m,ax,y,nt);
    }

    fflush(stdout);
  } 
  printf("\n");

  free(ax);

  float *v=vout ? vout : fmat_new(nev,n);

  ret=arpack_eigs_end(ae,s,v);

  if(ret>0) {
    int nconv=ret;
        
    if(s)
      for(j=0;j<nconv;j++) 
        s[j]=sqrt(s[j]);    

    if(uout) 
      for(i=0;i<nconv;i++) {
        float *u=uout+m*(long)i;
        if(!a_transposed)
          fmat_mul_v(m,n,a,n,v+n*(long)i,u,nt);
        else
          fmat_mul_tv(m,n,a,m,v+n*(long)i,u,nt);
        fvec_normalize(u,m,2);
      }               
    
  }

  if(!vout) free(v);
  
  return ret;
}
Ejemplo n.º 13
0
float *fmat_new_get_columns (const float *a, int nrow, int ncolout, const int *cols) {
  float *b = fmat_new (nrow, ncolout);
  fmat_get_columns(a, nrow, ncolout, cols, b);
  return b;
}