Doxygen Source Code Documentation
mri_to_short.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Functions | |
MRI_IMAGE * | mri_to_short (double scl, MRI_IMAGE *oldim) |
MRI_IMAGE * | mri_to_short_scl (double scl, double lev, MRI_IMAGE *oldim) |
MRI_IMAGE * | mri_to_short_sclip (double scl, double lev, int bot, int top, MRI_IMAGE *oldim) |
Function Documentation
|
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 } |
|
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 } |
|
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 } |