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_to_short.c File Reference

#include "mrilib.h"

Go to the source code of this file.


Functions

MRI_IMAGEmri_to_short (double scl, MRI_IMAGE *oldim)
MRI_IMAGEmri_to_short_scl (double scl, double lev, MRI_IMAGE *oldim)
MRI_IMAGEmri_to_short_sclip (double scl, double lev, int bot, int top, MRI_IMAGE *oldim)

Function Documentation

MRI_IMAGE* mri_to_short double    scl,
MRI_IMAGE   oldim
 

Definition at line 11 of file mri_to_short.c.

References MRI_DATA::byte_data, CABS, MRI_DATA::complex_data, MRI_DATA::double_data, ENTRY, MRI_DATA::float_data, MRI_IMAGE::im, MRI_DATA::int_data, MRI_IMAGE::kind, MRI_COPY_AUX, MRI_FATAL_ERROR, mri_maxabs(), mri_new_conforming, MRI_IMAGE::nvox, RETURN, MRI_DATA::rgb_data, scale, MRI_DATA::short_data, and SHORTIZE.

Referenced by main(), mri_brainormalize(), mri_histogram(), mri_percents(), mri_quantile(), mri_read_3A(), mri_threshold(), mri_to_mri(), mri_to_mri_scl(), RT_registration_2D_onevol(), RT_registration_3D_onevol(), T3D_read_images(), THD_cliplevel(), VOLREG_main(), and write_images().

00012 {
00013    MRI_IMAGE *newim ;
00014    register int ii , npix ;
00015    register double scale , val ;
00016 
00017 ENTRY("mri_to_short") ;
00018 
00019    if( oldim == NULL ) RETURN( NULL );  /* 09 Feb 1999 */
00020 
00021    newim = mri_new_conforming( oldim , MRI_short ) ;
00022    npix  = oldim->nvox ;
00023 
00024    if( scl == 0.0 ){
00025       switch( oldim->kind ){
00026          case MRI_int:
00027          case MRI_float:
00028          case MRI_double:
00029          case MRI_complex:
00030             scale = mri_maxabs( oldim ) ;
00031             if( scale != 0.0 ) scale = 10000.0 / scale ;
00032 #ifdef MRI_DEBUG
00033    fprintf( stderr , "mri_to_short: scale factor = %e\n" , scale ) ;
00034 #endif
00035             break ;
00036 
00037          default:
00038             scale = 1.0 ;
00039             break ;
00040       }
00041    } else {
00042       scale = scl ;
00043    }
00044 
00045    switch( oldim->kind ){
00046 
00047       case MRI_rgb:{
00048          byte *rgb = oldim->im.rgb_data ;
00049          float rfac=0.299*scale , gfac=0.587*scale , bfac=0.114*scale ;
00050 
00051          for( ii=0 ; ii < npix ; ii++ )
00052             newim->im.short_data[ii] = (short)(  rfac * rgb[3*ii]
00053                                                + gfac * rgb[3*ii+1]
00054                                                + bfac * rgb[3*ii+2] ) ;
00055       }
00056       break ;
00057 
00058       case MRI_byte:
00059          if( scale != 1.0 )
00060             for( ii=0 ; ii < npix ; ii++ ){
00061                val = scale * oldim->im.byte_data[ii] ;
00062                newim->im.short_data[ii] = SHORTIZE(val) ;
00063             }
00064          else
00065             for( ii=0 ; ii < npix ; ii++ )
00066                newim->im.short_data[ii] = (short) oldim->im.byte_data[ii] ;
00067          break ;
00068 
00069       case MRI_short:
00070 #ifndef DONT_USE_MEMCPY       /* this is a double negative! */
00071          if( scale != 1.0 )
00072 #endif
00073             for( ii=0 ; ii < npix ; ii++ ){
00074                val = scale * oldim->im.short_data[ii] ;
00075                newim->im.short_data[ii] = SHORTIZE(val) ;
00076             }
00077 #ifndef DONT_USE_MEMCPY
00078          else
00079             (void) memcpy( newim->im.short_data ,
00080                            oldim->im.short_data , sizeof(short)*npix ) ;
00081 #endif
00082          break ;
00083 
00084       case MRI_int:
00085          if( scale != 1.0 )
00086             for( ii=0 ; ii < npix ; ii++ ){
00087                val = scale * oldim->im.int_data[ii] ;
00088                newim->im.short_data[ii] = SHORTIZE(val) ;
00089             }
00090          else
00091             for( ii=0 ; ii < npix ; ii++ )
00092                newim->im.short_data[ii] = SHORTIZE(oldim->im.int_data[ii]) ;
00093          break ;
00094 
00095       case MRI_float:
00096          if( scale != 1.0 )
00097             for( ii=0 ; ii < npix ; ii++ ){
00098                val = scale * oldim->im.float_data[ii] ;
00099                newim->im.short_data[ii] = SHORTIZE(val) ;
00100             }
00101          else
00102             for( ii=0 ; ii < npix ; ii++ )
00103                newim->im.short_data[ii] = SHORTIZE(oldim->im.float_data[ii]) ;
00104          break ;
00105 
00106       case MRI_double:
00107          for( ii=0 ; ii < npix ; ii++ )
00108             newim->im.short_data[ii] = scale * oldim->im.double_data[ii] ;
00109          break ;
00110 
00111       case MRI_complex:
00112         for( ii=0 ; ii < npix ; ii++ )
00113            newim->im.short_data[ii] = scale * CABS(oldim->im.complex_data[ii]) ;
00114         break ;
00115 
00116       default:
00117          fprintf( stderr , "mri_to_short:  unrecognized image kind\n" ) ;
00118          MRI_FATAL_ERROR ;
00119    }
00120 
00121    MRI_COPY_AUX(newim,oldim) ;
00122    RETURN( newim );
00123 }

MRI_IMAGE* mri_to_short_scl double    scl,
double    lev,
MRI_IMAGE   oldim
 

Definition at line 127 of file mri_to_short.c.

References mri_to_short_sclip().

Referenced by main(), mri_to_mri(), and T3D_read_images().

00128 {
00129    MRI_IMAGE * im ;
00130    im =  mri_to_short_sclip( scl , lev , 0,0 , oldim ) ;
00131    return im ;
00132 }

MRI_IMAGE* mri_to_short_sclip double    scl,
double    lev,
int    bot,
int    top,
MRI_IMAGE   oldim
 

Definition at line 137 of file mri_to_short.c.

References BYTEIZE, CABS, ENTRY, MRI_IMAGE::kind, MRI_COPY_AUX, mri_data_pointer(), MRI_FATAL_ERROR, mri_max(), mri_min(), mri_new_conforming, MRI_IMAGE::nvox, RETURN, scale, SHORTIZE, top, and tt.

Referenced by ISQ_process_mri(), and mri_to_short_scl().

00139 {
00140    MRI_IMAGE *newim ;
00141    register int ii , npix ;
00142    double   imin,imax ;
00143    register double dscale , dbbot ;
00144    register float  scale  , flbot , val ;
00145    register short * ar ;
00146 
00147 ENTRY("mri_to_short_sclip") ;
00148 
00149    if( oldim == NULL ) RETURN( NULL );  /* 09 Feb 1999 */
00150 
00151    newim = mri_new_conforming( oldim , MRI_short ) ;
00152    npix  = oldim->nvox ;
00153 
00154    if( scl == 0 ){  /* compute scaling to make [min..max] -> [0..lev] */
00155 
00156       imin = (oldim->kind==MRI_complex || oldim->kind==MRI_rgb) ? (0) : mri_min(oldim) ;
00157       imax = mri_max( oldim ) ;
00158       imax = (imax <= imin) ? imin+1 : imax ;
00159 
00160       scale = dscale = (lev+0.99) / (imax-imin)  ;
00161       flbot = dbbot  = imin ;
00162 
00163    } else {          /* user controlled scaling, with lev -> 0 */
00164       scale = dscale = scl ;
00165       flbot = dbbot  = lev ;
00166    }
00167 
00168    ar = mri_data_pointer( newim ) ;  /* fast access to data */
00169 
00170    switch( oldim->kind ){
00171 
00172       case MRI_rgb:{
00173          register byte * rgb = mri_data_pointer(oldim) ;
00174          float rfac=0.299*scale , gfac=0.587*scale , bfac=0.114*scale ;
00175          for( ii=0 ; ii < npix ; ii++ )
00176             ar[ii] = (short) (  rfac * rgb[3*ii]
00177                               + gfac * rgb[3*ii+1]
00178                               + bfac * rgb[3*ii+2] ) ;
00179       }
00180       break ;
00181 
00182       case MRI_byte:{
00183          register byte * oar = mri_data_pointer(oldim) ;
00184          for( ii=0 ; ii < npix ; ii++ ){
00185             val = scale * (oar[ii]-flbot) ;
00186             ar[ii] = BYTEIZE(val) ;
00187          }
00188          break ;
00189       }
00190 
00191       case MRI_short:{
00192          register short * oar = mri_data_pointer(oldim) ;
00193          for( ii=0 ; ii < npix ; ii++ ){
00194             val = scale * (oar[ii]-flbot) ;
00195             ar[ii] = SHORTIZE(val) ;
00196          }
00197          break ;
00198       }
00199 
00200       case MRI_int:{
00201          register int * oar = mri_data_pointer(oldim) ;
00202          for( ii=0 ; ii < npix ; ii++ )
00203             ar[ii] = scale * (oar[ii]-flbot) ;
00204          break ;
00205       }
00206 
00207       case MRI_float:{
00208          register float * oar = mri_data_pointer(oldim) ;
00209          for( ii=0 ; ii < npix ; ii++ )
00210             ar[ii] = scale * (oar[ii]-flbot) ;
00211          break ;
00212       }
00213 
00214       case MRI_double:{
00215          register double * oar = mri_data_pointer(oldim) ;
00216          for( ii=0 ; ii < npix ; ii++ )
00217             ar[ii] = dscale * (oar[ii]-dbbot) ;
00218          break ;
00219       }
00220 
00221       case MRI_complex:{
00222          register complex * oar = mri_data_pointer(oldim) ;
00223          for( ii=0 ; ii < npix ; ii++ )
00224             ar[ii] = scale * CABS(oar[ii]) ;
00225          break ;
00226       }
00227 
00228       default:
00229          fprintf( stderr , "mri_to_short_scl:  unrecognized image kind\n" ) ;
00230          MRI_FATAL_ERROR ;
00231    }
00232 
00233    /* clip, if desired */
00234 
00235    if( bot < top ){
00236       register short bb = bot , tt = top ;
00237       for( ii=0 ; ii < npix ; ii++ ){
00238               if( ar[ii] < bb ) ar[ii] = bb ;
00239          else if( ar[ii] > tt ) ar[ii] = tt ;
00240       }
00241    }
00242 
00243    MRI_COPY_AUX(newim,oldim) ;
00244    RETURN( newim );
00245 }
 

Powered by Plone

This site conforms to the following standards: