Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
mri_edit.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 #include "mrilib.h"
00008 
00009 
00010 
00011 #ifndef MAX
00012 # define MAX(x,y) (((x)>(y))?(x):(y))
00013 #endif
00014 
00015 
00016 
00017 MRI_IMAGE * mri_edit_image( float pthr , float power , MRI_IMAGE *imin )
00018 {
00019    int ii , npix , nsum ;
00020    float val ;
00021    MRI_IMAGE *imqq ;
00022    float *flin ;
00023 
00024 ENTRY("mri_edit_image") ;
00025 
00026    imqq = mri_to_float( imin ) ;
00027    flin = mri_data_pointer( imqq ) ;
00028    npix = imqq->nvox ;
00029 
00030    if( (power==0.0 || power==1.0) && (pthr==0.0) ) RETURN(imqq) ;
00031 
00032    if( pthr > 0.0 && pthr < 1.0 ){
00033       register float sum , fa , scl,fmax ;
00034       register int nsum ;
00035 
00036       fmax = fabs(mri_max(imqq)) ;
00037       val  = fabs(mri_min(imqq)) ;
00038       fmax = MAX(fmax,val) ;
00039       val  = pthr * fmax ;           
00040       sum  = 0.0 ;
00041       nsum = 0 ;
00042 
00043       for( ii=0 ; ii < npix ; ii++ ){
00044          fa = flin[ii] = fabs(flin[ii]) ;
00045          if( fa > val ){ sum += fa ; nsum++ ; }
00046       }
00047       val = pthr * sum / nsum ;    
00048 
00049 #ifdef HARD_THRESH
00050       for( ii=0 ; ii < npix ; ii++ ) if(flin[ii] < val) flin[ii] = 0.0 ;
00051 #else
00052       scl = fmax / (fmax-val) ;
00053       for( ii=0 ; ii < npix ; ii++ ){
00054          fa = flin[ii] ;
00055          flin[ii] = (fa < val) ? (0.0) : (scl*(fa-val)) ;
00056       }
00057 #endif
00058    }  
00059 
00060    if( power != 0.0 && power != 1.0 ){
00061      for( ii=0 ; ii < npix ; ii++ ) flin[ii] = pow( fabs(flin[ii]) , power ) ;
00062    }
00063 
00064    MRI_COPY_AUX(imqq,imin) ;
00065    RETURN(imqq) ;
00066 }