Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
mri_entropy16.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002
00003
00004
00005 #undef SNUM
00006 #define SNUM 65536
00007
00008 double mri_entropy16( MRI_IMAGE *im )
00009 {
00010 register int *scount , snum , ii ;
00011 register unsigned short *sar ;
00012 register double sum ;
00013
00014 ENTRY("mri_entropy16") ;
00015
00016 if( im == NULL ) RETURN(0.0l) ;
00017
00018 sar = (unsigned short *) mri_data_pointer( im ) ;
00019 if( sar == NULL ) RETURN(0.0l) ;
00020
00021 snum = (im->nvox * im->pixel_size) / 2 ; if( snum < 2 ) RETURN(0.0l) ;
00022 scount = (int *) calloc( sizeof(int),SNUM ) ;
00023
00024 for( ii=0 ; ii < snum ; ii++ ) scount[sar[ii]]++ ;
00025
00026 sum = 0.0 ;
00027 for( ii=0 ; ii < SNUM ; ii++ )
00028 if( scount[ii] > 0 ) sum += scount[ii] * log((double)scount[ii]) ;
00029
00030 free( (void *)scount ) ;
00031
00032 sum = -(sum - snum*log((double)snum)) / ( log(2.0l) * snum ) ;
00033 RETURN(sum) ;
00034 }
00035
00036
00037
00038 #undef BNUM
00039 #define BNUM 256
00040
00041 double mri_entropy8( MRI_IMAGE *im )
00042 {
00043 register int *bcount , bnum , ii ;
00044 register byte *bar ;
00045 register double sum ;
00046
00047 ENTRY("mri_entropy8") ;
00048
00049 if( im == NULL ) RETURN(0.0l) ;
00050
00051 bar = (byte *) mri_data_pointer( im ) ;
00052 if( bar == NULL ) RETURN(0.0l) ;
00053
00054 bnum = (im->nvox * im->pixel_size) ; if( bnum < 2 ) RETURN(0.0l) ;
00055 bcount = (int *) calloc( sizeof(int),BNUM ) ;
00056
00057 for( ii=0 ; ii < bnum ; ii++ ) bcount[bar[ii]]++ ;
00058
00059 sum = 0.0 ;
00060 for( ii=0 ; ii < BNUM ; ii++ )
00061 if( bcount[ii] > 0 ) sum += bcount[ii] * log((double)bcount[ii]) ;
00062
00063 free( (void *)bcount ) ;
00064
00065 sum = -(sum - bnum*log((double)bnum)) / ( log(2.0l) * bnum ) ;
00066 RETURN(sum) ;
00067 }