/* create a pyramid of color images using a given scale factor, stopping when one dimension reach min_size and with applying a gaussian smoothing of standard deviation spyr (no smoothing if 0) */ color_image_pyramid_t *color_image_pyramid_create(const color_image_t *src, const float scale_factor, const int min_size, const float spyr){ const int nb_max_scale = 1000; // allocate structure color_image_pyramid_t *pyramid = color_image_pyramid_new(); pyramid->min_size = min_size; pyramid->scale_factor = scale_factor; convolution_t *conv = NULL; if(spyr>0.0f){ int fsize; float *filter_coef = gaussian_filter(spyr, &fsize); conv = convolution_new(fsize, filter_coef, 1); free(filter_coef); } color_image_pyramid_set_size(pyramid, nb_max_scale); pyramid->images[0] = color_image_cpy(src); int i; for( i=1 ; i<nb_max_scale ; i++){ const int oldwidth = pyramid->images[i-1]->width, oldheight = pyramid->images[i-1]->height; const int newwidth = (int) (1.5f + (oldwidth-1) / scale_factor); const int newheight = (int) (1.5f + (oldheight-1) / scale_factor); if( newwidth <= min_size || newheight <= min_size){ color_image_pyramid_set_size(pyramid, i); break; } if(spyr>0.0f){ color_image_t* tmp = color_image_new(oldwidth, oldheight); color_image_convolve_hv(tmp,pyramid->images[i-1], conv, conv); pyramid->images[i]= color_image_resize_bilinear(tmp, scale_factor); color_image_delete(tmp); }else{ pyramid->images[i] = color_image_resize_bilinear(pyramid->images[i-1], scale_factor); } } if(spyr>0.0f){ convolution_delete(conv); } return pyramid; }
float *color_gist_scaletab(color_image_t *src, int w, int n_scale, const int *n_orientation) { int i; if(src->width < 8 || src->height < 8) { fprintf(stderr, "Error: color_gist_scaletab() - Image not big enough !\n"); return NULL; } int numberBlocks = w; int tot_oris=0; for(i=0;i<n_scale;i++) tot_oris+=n_orientation[i]; color_image_t *img = color_image_cpy(src); image_list_t *G = create_gabor(n_scale, n_orientation, img->width, img->height); color_prefilt(img, 4); float *g = color_gist_gabor(img, numberBlocks, G); for(i = 0; i < tot_oris*w*w*3; i++) { if(!finite(g[i])) { fprintf(stderr, "Error: color_gist_scaletab() - descriptor not valid (nan or inf)\n"); free(g); g=NULL; break; } } image_list_delete(G); color_image_delete(img); return g; }