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)8 double 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)41 double 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