Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

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  /* one for every possible 16 bit pattern */
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  /* one for every possible 8 bit pattern */
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 }
 

Powered by Plone

This site conforms to the following standards: