/* * FLOATIMG * calculer un histogramme et l'afficher */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include "../floatimg.h" extern int verbosity; /* --------------------------------------------------------------------- */ int fimg_calcul_histo(FloatImg *src, long *ghist, int sz) { float maxval; int x, y, idx; float rgb[3], moy; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %p %d )\n", __func__, src, ghist, sz); #endif if (FIMG_TYPE_RGB != src->type) { fprintf(stderr, "%s: bad type %d of image\n", __func__, src->type); return -97; } maxval = fimg_get_maxvalue(src); fprintf(stderr, "maximum is %f\n", maxval); for (y=0; y<src->height; y++) { for(x=0; x<src->width; x++) { fimg_get_rgb(src, x, y, rgb); moy = (rgb[0]+rgb[1]+rgb[2]) / 3.0; /* ok, here the had math part ... */ idx = (int)( (moy*sz) / maxval); /* sanity check */ if (idx<0 || idx>=sz) { fprintf(stderr, "idx = %d, error\n", idx); abort(); } ghist[idx]++; } } return -66; } /* --------------------------------------------------------------------- */ int fimg_essai_histo(FloatImg *src, char *outpic, int nbslices) { long *histo; int foo; FILE *pipe; fprintf(stderr, ">>> %s ( %p '%s' %d )\n", __func__, src, outpic, nbslices); if (NULL==(histo=calloc(nbslices, sizeof(long)))) { fprintf(stderr, "OUT OF MEMORY\n"); abort(); } foo = fimg_calcul_histo(src, histo, nbslices); // for (foo=0; foo<NSLICES; foo++) { // printf("%7d %ld\n", foo, histo[foo]); // } pipe = popen("gnuplot", "w"); if (NULL==pipe) { fprintf(stderr, "%s: error running gnuplot\n", __func__); return -17; } fprintf(pipe, "set term png size 1024,512\n"); fprintf(pipe, "set grid\n"); fprintf(pipe, "set output \"%s\"\n", outpic); fprintf(pipe, "plot '/dev/stdin' with lines\n"); for (foo=0; foo<nbslices; foo++) { fprintf(pipe, "%d %ld\n", foo, histo[foo]); } pclose(pipe); // and not fclose (see man page) free(histo); return 0; } /* --------------------------------------------------------------------- */