115 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 		metriques.c
 | |
|  */
 | |
| 
 | |
| #include  <stdio.h>
 | |
| #include  <stdlib.h>
 | |
| #include  "../floatimg.h"
 | |
| #include  "metriques.h"
 | |
| 
 | |
| extern int		verbosity;
 | |
| 
 | |
| /*   --------------------------------------------------------------   */
 | |
| int stat_zone(FloatImg *pimg, int geom[4], float v3[3])
 | |
| {
 | |
| int		x, y, xe, ye;
 | |
| int		off;
 | |
| double		accus[3], divisor;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stdout, "geom: %5d %5d %5d %5d\n", 
 | |
| 			geom[0], geom[1], geom[2], geom[3]);
 | |
| #endif
 | |
| 
 | |
| xe = geom[0] + geom[2];
 | |
| ye = geom[1] + geom[3];
 | |
| 
 | |
| accus[0] = accus[1] = accus[2] = 0.0;
 | |
| for (y=geom[1]; y<ye; y++) {
 | |
| 	for (x=geom[0]; x<xe; x++) {
 | |
| 		off = (y*pimg->width) + x;
 | |
| 		accus[0] += (double) pimg->R[off];
 | |
| 		accus[1] += (double) pimg->G[off];
 | |
| 		accus[2] += (double) pimg->B[off];
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| divisor = (double)(geom[2] * geom[3]);		/* array of zone */
 | |
| v3[0] = (float)(accus[0] / divisor);
 | |
| v3[1] = (float)(accus[1] / divisor);
 | |
| v3[2] = (float)(accus[2] / divisor);
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /*   --------------------------------------------------------------   */
 | |
| /*
 | |
|  *	premier essai...
 | |
|  */
 | |
| int get_float_metric_a(FloatImg *pimg, float *where)
 | |
| {
 | |
| float		means[4];	/* four values : R G B A */
 | |
| int		foo;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p )\n", __func__, pimg, where);
 | |
| #endif
 | |
| 
 | |
| foo = fimg_meanvalues(pimg, means);
 | |
| if (foo) {
 | |
| 	fprintf(stderr, "fatal error in %s\n", __func__);
 | |
| 	exit(1);
 | |
| 	}
 | |
| *where = means[0] + means[1] + means[2];
 | |
| return 0;
 | |
| }
 | |
| /*   --------------------------------------------------------------   */
 | |
| int get_float_metric_b(FloatImg *pimg, float *where)
 | |
| {
 | |
| int	idx, size, nbre;
 | |
| double	adder;
 | |
| 
 | |
| adder = 0.0;
 | |
| nbre = 0;
 | |
| size = pimg->width * pimg->height;
 | |
| for (idx=20; idx < size; idx+=42) {
 | |
| 	adder += (double)pimg->R[idx];
 | |
| 	nbre++;
 | |
| 	}
 | |
| *where = (float)(adder/(nbre+1));
 | |
| return 0;
 | |
| }
 | |
| /*   --------------------------------------------------------------   */
 | |
| int get_float_metric_from_file(char *fname, float *where, int mode)
 | |
| {
 | |
| FloatImg	image;
 | |
| int		foo;
 | |
| float		fval;
 | |
| 
 | |
| foo = fimg_create_from_dump(fname, &image);
 | |
| if (foo) {
 | |
| 	fprintf(stderr, "%s: err %d loading %s\n", __func__, foo, fname);
 | |
| 	return foo;
 | |
| 	}
 | |
| fval = -1.0;				/* sensible default value */
 | |
| switch (mode) {
 | |
| 	case 0: case 1:
 | |
| 		foo = get_float_metric_a(&image, &fval);
 | |
| 		break;
 | |
| 	case 2:
 | |
| 		foo = get_float_metric_b(&image, &fval);
 | |
| 		break;
 | |
| 	default:
 | |
| 		fprintf(stderr, "%s: method %d invalid\n", 
 | |
| 				__func__, mode);
 | |
| 		exit(1);
 | |
| 		break;		/* not reached */
 | |
| 	}
 | |
| 
 | |
| *where = fval;
 | |
| 
 | |
| fimg_destroy(&image);
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /*   --------------------------------------------------------------   */
 | 
