/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "mrilib.h"
/*** NOT 7D SAFE ***/
/* Collect stats on sequence of images.
Usage: call repeatedly, once for each image; will return void.
after last image, call with NULL as argument, will return
pointer to array of two pointers to (float) images, the
first the mean, the second the stdev.
*/
MRI_IMAGE ** mri_stat_seq( MRI_IMAGE * imin )
{
/* static variables (exist between calls) */
static MRI_IMAGE * imsum , * imsumq ;
static int nim = 0 , npix , nx , ny ;
static double * dbsum , * dbsumq ;
/* local variables */
register int ii ;
MRI_IMAGE * imfl , * imsd , ** retval ;
float * flar , * sdar ;
double scl , vscl , vvv ;
/*** case: set up new problem ***/
if( nim == 0 ){
if( imin == NULL ){
fprintf(stderr,"mri_stat_seq: NULL argument for initial call!\n") ;
EXIT(1) ;
}
if( ! MRI_IS_2D(imin) ){
fprintf(stderr,"\n*** mri_stat_seq: only works on 2D images!\n") ;
EXIT(1) ;
}
nx = imin->nx ;
ny = imin->ny ;
npix = nx * ny ;
imsum = mri_new( nx , ny , MRI_double ) ;
imsumq = mri_new( nx , ny , MRI_double ) ;
dbsum = mri_data_pointer( imsum ) ;
dbsumq = mri_data_pointer( imsumq ) ;
MRI_COPY_AUX(imsum,imin) ;
for( ii=0 ; ii < npix ; ii++ ) dbsum[ii] = dbsumq[ii] = 0.0 ;
}
/*** case: add new image into problem ***/
if( imin != NULL ){
if( imin->nx != nx || imin->ny != ny ){
fprintf(stderr,"mri_stat_seq: input image size mismatch!\n") ;
EXIT(1) ;
}
if( ! MRI_IS_2D(imin) ){
fprintf(stderr,"\n*** mri_stat_seq: only works on 2D images!\n") ;
EXIT(1) ;
}
if( imin->kind == MRI_float ){
imfl = imin ;
} else {
imfl = mri_to_float( imin ) ;
}
flar = mri_data_pointer( imfl ) ;
for( ii=0 ; ii < npix ; ii++ ){
dbsum[ii] += flar[ii] ;
dbsumq[ii] += flar[ii] * flar[ii] ;
}
if( imin != imfl ) mri_free( imfl ) ;
nim++ ;
return NULL ;
}
/*** case: make report on results, and reset static data ***/
if( nim < 1 ){
fprintf(stderr,"mri_stat_seq: # images input=%d; too small!\n",nim) ;
EXIT(1) ;
}
imfl = mri_new( nx , ny , MRI_float ) ;
imsd = mri_new( nx , ny , MRI_float ) ;
flar = mri_data_pointer( imfl ) ;
sdar = mri_data_pointer( imsd ) ;
MRI_COPY_AUX(imfl,imsum) ;
scl = 1.0 / nim ;
vscl = (nim==1) ? 1.0 : sqrt( ((double)(nim))/(nim-1.0) ) ;
for( ii=0 ; ii < npix ; ii++ ){
flar[ii] = scl * dbsum[ii] ;
vvv = scl * dbsumq[ii] - flar[ii] * flar[ii] ;
sdar[ii] = (vvv > 0.0) ? (sqrt(vvv)*vscl) : 0.0 ;
}
mri_free( imsum ) ; mri_free( imsumq ) ;
nim = 0 ;
retval = (MRI_IMAGE **) malloc( 2 * sizeof(MRI_IMAGE *) ) ;
if( retval == NULL ){
fprintf(stderr,"mri_stat_seq: malloc error for retval!\n") ;
EXIT(1) ;
}
retval[0] = imfl ;
retval[1] = imsd ;
return retval ;
}
syntax highlighted by Code2HTML, v. 0.9.1