void SimilarityContent::addImage(VImage *vim) { color_image_t* im = makeGistImage(vim); float* desc = color_gist_scaletab( im, NBLOCKS, N_SCALE, ORIENTATIONS_PER_SCALE); color_image_delete(im); descriptions[vim] = desc; }
int main(int argc,char **args) { const char *infilename="/dev/stdin"; int nblocks=4; int n_scale=3; int orientations_per_scale[50]={8,8,4}; while(*++args) { const char *a=*args; if(!strcmp(a,"-h")) usage(); else if(!strcmp(a,"-nblocks")) { if(!sscanf(*++args,"%d",&nblocks)) { fprintf(stderr,"could not parse %s argument",a); usage(); } } else if(!strcmp(a,"-orientationsPerScale")) { char *c; n_scale=0; for(c=strtok(*++args,",");c;c=strtok(NULL,",")) { if(!sscanf(c,"%d",&orientations_per_scale[n_scale++])) { fprintf(stderr,"could not parse %s argument",a); usage(); } } } else { infilename=a; } } color_image_t *im=load_ppm(infilename); float *desc = color_gist_scaletab(im,nblocks,n_scale,orientations_per_scale); int i; int descsize=0; /* compute descriptor size */ for(i=0;i<n_scale;i++) descsize+=nblocks*nblocks*orientations_per_scale[i]; descsize*=3; /* color */ /* print descriptor */ for(i=0;i<descsize;i++) printf("%.4f ",desc[i]); printf("\n"); free(desc); color_image_delete(im); return 0; }
float *color_gist(color_image_t *src, int w, int a, int b, int c) { int orientationsPerScale[3]; orientationsPerScale[0] = a; orientationsPerScale[1] = b; orientationsPerScale[2] = c; return color_gist_scaletab(src,w,3,orientationsPerScale); }
void color_gist_scaletab_wrap(uint8_t *data, int height, int width, int nblocks, int n_scale, const int *orientations_per_scale, float *desc, int desc_size) { color_image_t *im=color_image_new(width, height); int i, size = height * width; for (i = 0; i < size; ++i) { im->c1[i] = *(data++); im->c2[i] = *(data++); im->c3[i] = *(data++); } float *desc_out = color_gist_scaletab(im, nblocks, n_scale, orientations_per_scale); memcpy(desc, desc_out, desc_size * sizeof(float)); free(desc_out); color_image_delete(im); }
void color_gist_scaletab_wrap(unsigned char *data, int height, int width, int nblocks, int n_scale, const int *orientations_per_scale, float *desc, int desc_size) { float *desc_out; color_image_t *im=color_image_new(width, height); int i, size = height * width; // Not only copies to data structure but also switches BGR -> RGB for (i = 0; i < size; ++i) { im->c3[i] = *(data++); im->c2[i] = *(data++); im->c1[i] = *(data++); } desc_out = color_gist_scaletab(im, nblocks, n_scale, orientations_per_scale); if (desc_out != NULL) memcpy(desc, desc_out, desc_size * sizeof(float)); free(desc_out); color_image_delete(im); }
static PyObject* gist_extract(PyObject *self, PyObject *args) { int nblocks=4; int n_scale=3; int orientations_per_scale[50]={8,8,4}; PyArrayObject *image, *descriptor; if (!PyArg_ParseTuple(args, "O", &image)) { return NULL; } if (PyArray_TYPE(image) != NPY_UINT8) { PyErr_SetString(PyExc_TypeError, "type of image must be uint8"); return NULL; } if (PyArray_NDIM(image) != 3) { PyErr_SetString(PyExc_TypeError, "dimensions of image must be 3."); return NULL; } npy_intp *dims_image = PyArray_DIMS(image); const int w = (int) *(dims_image+1); const int h = (int) *(dims_image); // Read image to color_image_t structure color_image_t *im=color_image_new(w,h); for (int y=0, i=0 ; y<h ; ++y) { for (int x=0 ; x<w ; ++x, ++i) { im->c1[i] = *(unsigned char *)PyArray_GETPTR3(image, y, x, 0); im->c2[i] = *(unsigned char *)PyArray_GETPTR3(image, y, x, 1); im->c3[i] = *(unsigned char *)PyArray_GETPTR3(image, y, x, 2); } } // Extract descriptor float *desc=color_gist_scaletab(im,nblocks,n_scale,orientations_per_scale); int descsize=0; /* compute descriptor size */ for(int i=0;i<n_scale;i++) descsize+=nblocks*nblocks*orientations_per_scale[i]; descsize*=3; /* color */ // Allocate output npy_intp dim_desc[1] = {descsize}; descriptor = (PyArrayObject *) PyArray_SimpleNew(1, dim_desc, NPY_FLOAT); // Set val for (int i=0 ; i<descsize ; ++i) { *(float *)PyArray_GETPTR1(descriptor, i) = desc[i]; } // Release memory color_image_delete(im); free(desc); return PyArray_Return(descriptor); }