1 #include "mrilib.h" 2 3 /*-----------------------------------------------------------------------*/ 4 5 #undef SNUM 6 #define SNUM 65536 /* one for every possible 16 bit pattern */ 7 mri_entropy16(MRI_IMAGE * im)8double mri_entropy16( MRI_IMAGE *im ) 9 { 10 register int *scount , snum , ii ; 11 register unsigned short *sar ; 12 register double sum ; 13 14 ENTRY("mri_entropy16") ; 15 16 if( im == NULL ) RETURN(0.0l) ; 17 18 sar = (unsigned short *) mri_data_pointer( im ) ; 19 if( sar == NULL ) RETURN(0.0l) ; 20 21 snum = (im->nvox * im->pixel_size) / 2 ; if( snum < 2 ) RETURN(0.0l) ; 22 scount = (int *) calloc( sizeof(int),SNUM ) ; 23 24 for( ii=0 ; ii < snum ; ii++ ) scount[sar[ii]]++ ; 25 26 sum = 0.0 ; 27 for( ii=0 ; ii < SNUM ; ii++ ) 28 if( scount[ii] > 0 ) sum += scount[ii] * log((double)scount[ii]) ; 29 30 free( (void *)scount ) ; 31 32 sum = -(sum - snum*log((double)snum)) / ( log(2.0l) * snum ) ; 33 RETURN(sum) ; 34 } 35 36 /*-----------------------------------------------------------------------*/ 37 38 #undef BNUM 39 #define BNUM 256 /* one for every possible 8 bit pattern */ 40 mri_entropy8(MRI_IMAGE * im)41double mri_entropy8( MRI_IMAGE *im ) 42 { 43 register int *bcount , bnum , ii ; 44 register byte *bar ; 45 register double sum ; 46 47 ENTRY("mri_entropy8") ; 48 49 if( im == NULL ) RETURN(0.0l) ; 50 51 bar = (byte *) mri_data_pointer( im ) ; 52 if( bar == NULL ) RETURN(0.0l) ; 53 54 bnum = (im->nvox * im->pixel_size) ; if( bnum < 2 ) RETURN(0.0l) ; 55 bcount = (int *) calloc( sizeof(int),BNUM ) ; 56 57 for( ii=0 ; ii < bnum ; ii++ ) bcount[bar[ii]]++ ; 58 59 sum = 0.0 ; 60 for( ii=0 ; ii < BNUM ; ii++ ) 61 if( bcount[ii] > 0 ) sum += bcount[ii] * log((double)bcount[ii]) ; 62 63 free( (void *)bcount ) ; 64 65 sum = -(sum - bnum*log((double)bnum)) / ( log(2.0l) * bnum ) ; 66 RETURN(sum) ; 67 } 68