/** * im_mpercent_hist: * @hist: input histogram image * @percent: threshold percentage * @out: output threshold value * * Just like im_mpercent(), except it works on an image histogram. Handy if * you want to run im_mpercent() several times without having to recompute the * histogram each time. * * See also: im_mpercent(). * * Returns: 0 on success, -1 on error */ int im_mpercent_hist( IMAGE *hist, double percent, int *out ) { IMAGE *base; IMAGE *t[6]; double pos; if( im_check_hist( "im_mpercent", hist ) ) return( -1 ); if( !(base = im_open( "im_mpercent", "p" )) ) return( -1 ); if( im_open_local_array( base, t, 6, "im_mpercent", "p" ) ) { im_close( base ); return( -1 ); } if( im_histcum( hist, t[1] ) || im_histnorm( t[1], t[2] ) || im_lessconst( t[2], t[3], percent * t[2]->Xsize ) || im_fliphor( t[3], t[4] ) || im_profile( t[4], t[5], 1 ) || im_avg( t[5], &pos ) ) { im_close( base ); return( -1 ); } im_close( base ); *out = pos; return( 0 ); }
/* Find the number of non-zero pixels in a mask image. */ static int count_nonzero( IMAGE *in, gint64 *count ) { double avg; if( im_avg( in, &avg ) ) return( -1 ); *count = (avg * in->Xsize * in->Ysize ) / 255.0; return( 0 ); }
/** * im_benchmark2: * @in: input image * @out: average image value * * This operation runs a single im_benchmarkn() and calculates the average * pixel value. It's useful if you just want to test image input. * * See also: im_benchmarkn(). * * Returns: 0 on success, -1 on error */ int im_benchmark2( IMAGE *in, double *out ) { IMAGE *t; return( !(t = im_open_local( in, "benchmarkn", "p" )) || im_benchmarkn( in, t, 1 ) || im_avg( t, out ) ); }
/* Get the value of pixel (0, 0). Use this to init the min/max value for * im_max()/im_stats()/etc. */ int im__value( IMAGE *im, double *value ) { IMAGE *t; if( !(t = im_open( "im__value", "p" )) ) return( -1 ); if( im_extract_areabands( im, t, 0, 0, 1, 1, 0, 1 ) || im_avg( t, value ) ) { im_close( t ); return( -1 ); } im_close( t ); return( 0 ); }
/* Measure into array. */ static int measure_patches( IMAGE *im, double *coeff, int left, int top, int width, int height, int u, int v, int *sel, int nsel ) { IMAGE *tmp; int patch; int i, j; int m, n; double avg, dev; int x, y, w, h; /* How large are the patches we are to measure? */ double pw = (double) width / (double) u; double ph = (double) height / (double) v; /* Set up sub to be the size we need for a patch. */ w = (pw + 1) / 2; h = (ph + 1) / 2; /* Loop through sel, picking out areas to measure. */ for( j = 0, patch = 0; patch < nsel; patch++ ) { /* Sanity check. Is the patch number sensible? */ if( sel[patch] <= 0 || sel[patch] > u * v ) { im_error( "im_measure", _( "patch %d is out of range" ), sel[patch] ); return( 1 ); } /* Patch coordinates. */ m = (sel[patch] - 1) % u; n = (sel[patch] - 1) / u; /* Move sub to correct position. */ x = left + m * pw + (pw + 2) / 4; y = top + n * ph + (ph + 2) / 4; /* Loop through bands. */ for( i = 0; i < im->Bands; i++, j++ ) { /* Make temp buffer to extract to. */ if( !(tmp = im_open( "patch", "t" )) ) return( -1 ); /* Extract and measure. */ if( im_extract_areabands( im, tmp, x, y, w, h, i, 1 ) || im_avg( tmp, &avg ) || im_deviate( tmp, &dev ) ) { im_close( tmp ); return( -1 ); } im_close( tmp ); /* Is the deviation large compared with the average? * This could be a clue that our parameters have * caused us to miss the patch. Look out for averages * <0, or averages near zero (can get these if use * im_measure() on IM_TYPE_LAB images). */ if( dev * 5 > fabs( avg ) && fabs( avg ) > 3 ) im_warn( "im_measure", _( "patch %d, band %d: " "avg = %g, sdev = %g" ), patch, i, avg, dev ); /* Save results. */ coeff[j] = avg; } } return( 0 ); }