VipsStats tracks minpos/maxpos
plus some small bugfixes
This commit is contained in:
parent
1129d897ca
commit
62859facd4
@ -39,6 +39,7 @@
|
|||||||
- switch SMALLTILE to 128, 512 was just too big
|
- switch SMALLTILE to 128, 512 was just too big
|
||||||
- oop mode "rd" was not always being used for images
|
- oop mode "rd" was not always being used for images
|
||||||
- added ARRAY interpretation for images
|
- added ARRAY interpretation for images
|
||||||
|
- VipsStats tracks minpos/maxpos as well
|
||||||
|
|
||||||
12/10/11 started 7.26.6
|
12/10/11 started 7.26.6
|
||||||
- NOCACHE was not being set correctly on OS X causing performance
|
- NOCACHE was not being set correctly on OS X causing performance
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
* - gtkdoc comment
|
* - gtkdoc comment
|
||||||
* 7/11/11
|
* 7/11/11
|
||||||
* - redone as a class
|
* - redone as a class
|
||||||
|
* - track maxpos / minpos too
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -54,6 +55,10 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
#define VIPS_DEBUG
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif /*HAVE_CONFIG_H*/
|
#endif /*HAVE_CONFIG_H*/
|
||||||
@ -126,8 +131,8 @@ vips_stats_build( VipsObject *object )
|
|||||||
VipsStats *stats = (VipsStats *) object;
|
VipsStats *stats = (VipsStats *) object;
|
||||||
|
|
||||||
gint64 vals, pels;
|
gint64 vals, pels;
|
||||||
double *row0;
|
double *row0, *row;
|
||||||
int b;
|
int b, y, i;
|
||||||
|
|
||||||
if( statistic->in ) {
|
if( statistic->in ) {
|
||||||
int bands = vips_image_get_bands( statistic->in );
|
int bands = vips_image_get_bands( statistic->in );
|
||||||
@ -149,19 +154,31 @@ vips_stats_build( VipsObject *object )
|
|||||||
vals = pels * vips_image_get_bands( statistic->in );
|
vals = pels * vips_image_get_bands( statistic->in );
|
||||||
|
|
||||||
row0 = ARY( stats->out, 0, 0 );
|
row0 = ARY( stats->out, 0, 0 );
|
||||||
|
row = ARY( stats->out, 0, 1 );
|
||||||
|
for( i = 0; i < COL_LAST; i++ )
|
||||||
|
row0[i] = row[i];
|
||||||
|
|
||||||
row0[COL_MIN] = *ARY( stats->out, 0, COL_MIN );
|
for( b = 1; b < vips_image_get_bands( statistic->in ); b++ ) {
|
||||||
row0[COL_MAX] = *ARY( stats->out, 0, COL_MAX );
|
row = ARY( stats->out, 0, b + 1 );
|
||||||
row0[COL_SUM] = 0;
|
|
||||||
row0[COL_SUM2] = 0;
|
|
||||||
|
|
||||||
for( b = 0; b < vips_image_get_bands( statistic->in ); b++ ) {
|
if( row[COL_MIN] < row0[COL_MIN] ) {
|
||||||
double *row = ARY( stats->out, 0, b + 1 );
|
row0[COL_MIN] = row[COL_MIN];
|
||||||
|
row0[COL_XMIN] = row[COL_XMIN];
|
||||||
|
row0[COL_YMIN] = row[COL_YMIN];
|
||||||
|
}
|
||||||
|
|
||||||
|
if( row[COL_MAX] > row0[COL_MAX] ) {
|
||||||
|
row0[COL_MAX] = row[COL_MAX];
|
||||||
|
row0[COL_XMAX] = row[COL_XMAX];
|
||||||
|
row0[COL_YMAX] = row[COL_YMAX];
|
||||||
|
}
|
||||||
|
|
||||||
row0[COL_MIN] = VIPS_MIN( row0[COL_MIN], row[COL_MIN] );
|
|
||||||
row0[COL_MAX] = VIPS_MAX( row0[COL_MAX], row[COL_MAX] );
|
|
||||||
row0[COL_SUM] += row[COL_SUM];
|
row0[COL_SUM] += row[COL_SUM];
|
||||||
row0[COL_SUM2] += row[COL_SUM2];
|
row0[COL_SUM2] += row[COL_SUM2];
|
||||||
|
}
|
||||||
|
|
||||||
|
for( y = 1; y < vips_image_get_height( stats->out ); y++ ) {
|
||||||
|
double *row = ARY( stats->out, 0, y );
|
||||||
|
|
||||||
row[COL_AVG] = row[COL_SUM] / pels;
|
row[COL_AVG] = row[COL_SUM] / pels;
|
||||||
row[COL_SD] = sqrt( fabs( row[COL_SUM2] -
|
row[COL_SD] = sqrt( fabs( row[COL_SUM2] -
|
||||||
@ -191,10 +208,10 @@ vips_stats_stop( VipsStatistic *statistic, void *seq )
|
|||||||
double *p = ARY( local->out, 0, b + 1 );
|
double *p = ARY( local->out, 0, b + 1 );
|
||||||
double *q = ARY( global->out, 0, b + 1 );
|
double *q = ARY( global->out, 0, b + 1 );
|
||||||
|
|
||||||
q[COL_MIN] = p[COL_MIN];
|
int i;
|
||||||
q[COL_MAX] = p[COL_MAX];
|
|
||||||
q[COL_SUM] = p[COL_SUM];
|
for( i = 0; i < COL_LAST; i++ )
|
||||||
q[COL_SUM2] = p[COL_SUM2];
|
q[i] = p[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
global->set = TRUE;
|
global->set = TRUE;
|
||||||
@ -204,8 +221,18 @@ vips_stats_stop( VipsStatistic *statistic, void *seq )
|
|||||||
double *p = ARY( local->out, 0, b + 1 );
|
double *p = ARY( local->out, 0, b + 1 );
|
||||||
double *q = ARY( global->out, 0, b + 1 );
|
double *q = ARY( global->out, 0, b + 1 );
|
||||||
|
|
||||||
q[COL_MIN] = VIPS_MIN( q[COL_MIN], p[COL_MIN] );
|
if( p[COL_MIN] < q[COL_MIN] ) {
|
||||||
q[COL_MAX] = VIPS_MAX( q[COL_MAX], p[COL_MAX] );
|
q[COL_MIN] = p[COL_MIN];
|
||||||
|
q[COL_XMIN] = p[COL_XMIN];
|
||||||
|
q[COL_YMIN] = p[COL_YMIN];
|
||||||
|
}
|
||||||
|
|
||||||
|
if( p[COL_MAX] > q[COL_MAX] ) {
|
||||||
|
q[COL_MAX] = p[COL_MAX];
|
||||||
|
q[COL_XMAX] = p[COL_XMAX];
|
||||||
|
q[COL_YMAX] = p[COL_YMAX];
|
||||||
|
}
|
||||||
|
|
||||||
q[COL_SUM] += p[COL_SUM];
|
q[COL_SUM] += p[COL_SUM];
|
||||||
q[COL_SUM2] += p[COL_SUM2];
|
q[COL_SUM2] += p[COL_SUM2];
|
||||||
}
|
}
|
||||||
@ -245,29 +272,45 @@ vips_stats_start( VipsStatistic *statistic )
|
|||||||
double *q = ARY( local->out, 0, b + 1 ); \
|
double *q = ARY( local->out, 0, b + 1 ); \
|
||||||
TYPE small, big; \
|
TYPE small, big; \
|
||||||
double sum, sum2; \
|
double sum, sum2; \
|
||||||
|
int xmin, ymin; \
|
||||||
|
int xmax, ymax; \
|
||||||
\
|
\
|
||||||
if( local->set ) { \
|
if( local->set ) { \
|
||||||
small = q[COL_MIN]; \
|
small = q[COL_MIN]; \
|
||||||
big = q[COL_MAX]; \
|
big = q[COL_MAX]; \
|
||||||
sum = q[COL_SUM]; \
|
sum = q[COL_SUM]; \
|
||||||
sum2 = q[COL_SUM2]; \
|
sum2 = q[COL_SUM2]; \
|
||||||
|
xmin = q[COL_XMIN]; \
|
||||||
|
ymin = q[COL_YMIN]; \
|
||||||
|
xmax = q[COL_XMAX]; \
|
||||||
|
ymax = q[COL_YMAX]; \
|
||||||
} \
|
} \
|
||||||
else { \
|
else { \
|
||||||
small = p[0]; \
|
small = p[0]; \
|
||||||
big = p[0]; \
|
big = p[0]; \
|
||||||
sum = 0; \
|
sum = 0; \
|
||||||
sum2 = 0; \
|
sum2 = 0; \
|
||||||
|
xmin = x; \
|
||||||
|
ymin = y; \
|
||||||
|
xmax = x; \
|
||||||
|
ymax = y; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
for( i = 0; i < n; i++ ) { \
|
for( i = 0; i < n; i++ ) { \
|
||||||
TYPE value = *p; \
|
TYPE value = *p; \
|
||||||
\
|
\
|
||||||
sum += value;\
|
sum += value; \
|
||||||
sum2 += (double) value * (double) value;\
|
sum2 += (double) value * (double) value; \
|
||||||
if( value > big ) \
|
if( value > big ) { \
|
||||||
big = value; \
|
big = value; \
|
||||||
else if( value < small ) \
|
xmax = x + i; \
|
||||||
small = value;\
|
ymax = y; \
|
||||||
|
} \
|
||||||
|
else if( value < small ) { \
|
||||||
|
small = value; \
|
||||||
|
xmin = x + i; \
|
||||||
|
ymin = y; \
|
||||||
|
} \
|
||||||
\
|
\
|
||||||
p += bands; \
|
p += bands; \
|
||||||
} \
|
} \
|
||||||
@ -276,8 +319,13 @@ vips_stats_start( VipsStatistic *statistic )
|
|||||||
q[COL_MAX] = big; \
|
q[COL_MAX] = big; \
|
||||||
q[COL_SUM] = sum; \
|
q[COL_SUM] = sum; \
|
||||||
q[COL_SUM2] = sum2; \
|
q[COL_SUM2] = sum2; \
|
||||||
local->set = TRUE; \
|
q[COL_XMIN] = xmin; \
|
||||||
|
q[COL_YMIN] = ymin; \
|
||||||
|
q[COL_XMAX] = xmax; \
|
||||||
|
q[COL_YMAX] = ymax; \
|
||||||
} \
|
} \
|
||||||
|
\
|
||||||
|
local->set = TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop over region, accumulating a sum in *tmp.
|
/* Loop over region, accumulating a sum in *tmp.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user