#include "mrilib.h"
/*-----------------------------------------------------------------------*/
#undef SNUM
#define SNUM 65536 /* one for every possible 16 bit pattern */
double mri_entropy16( MRI_IMAGE *im )
{
register int *scount , snum , ii ;
register unsigned short *sar ;
register double sum ;
ENTRY("mri_entropy16") ;
if( im == NULL ) RETURN(0.0l) ;
sar = (unsigned short *) mri_data_pointer( im ) ;
if( sar == NULL ) RETURN(0.0l) ;
snum = (im->nvox * im->pixel_size) / 2 ; if( snum < 2 ) RETURN(0.0l) ;
scount = (int *) calloc( sizeof(int),SNUM ) ;
for( ii=0 ; ii < snum ; ii++ ) scount[sar[ii]]++ ;
sum = 0.0 ;
for( ii=0 ; ii < SNUM ; ii++ )
if( scount[ii] > 0 ) sum += scount[ii] * log((double)scount[ii]) ;
free( (void *)scount ) ;
sum = -(sum - snum*log((double)snum)) / ( log(2.0l) * snum ) ;
RETURN(sum) ;
}
/*-----------------------------------------------------------------------*/
#undef BNUM
#define BNUM 256 /* one for every possible 8 bit pattern */
double mri_entropy8( MRI_IMAGE *im )
{
register int *bcount , bnum , ii ;
register byte *bar ;
register double sum ;
ENTRY("mri_entropy8") ;
if( im == NULL ) RETURN(0.0l) ;
bar = (byte *) mri_data_pointer( im ) ;
if( bar == NULL ) RETURN(0.0l) ;
bnum = (im->nvox * im->pixel_size) ; if( bnum < 2 ) RETURN(0.0l) ;
bcount = (int *) calloc( sizeof(int),BNUM ) ;
for( ii=0 ; ii < bnum ; ii++ ) bcount[bar[ii]]++ ;
sum = 0.0 ;
for( ii=0 ; ii < BNUM ; ii++ )
if( bcount[ii] > 0 ) sum += bcount[ii] * log((double)bcount[ii]) ;
free( (void *)bcount ) ;
sum = -(sum - bnum*log((double)bnum)) / ( log(2.0l) * bnum ) ;
RETURN(sum) ;
}
syntax highlighted by Code2HTML, v. 0.9.1