Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
mri_to_complex.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 MRI_IMAGE *mri_to_complex( MRI_IMAGE *oldim )
00019 {
00020 MRI_IMAGE *newim ;
00021 register int ii , npix ;
00022
00023 ENTRY("mri_to_complex") ;
00024
00025 if( oldim == NULL ) RETURN( NULL );
00026
00027 newim = mri_new_conforming( oldim , MRI_complex ) ;
00028 npix = oldim->nvox ;
00029
00030 switch( oldim->kind ){
00031
00032 case MRI_byte:
00033 for( ii=0 ; ii < npix ; ii++ )
00034 newim->im.complex_data[ii].r = oldim->im.byte_data[ii] ;
00035 break ;
00036
00037 case MRI_short:
00038 for( ii=0 ; ii < npix ; ii++ )
00039 newim->im.complex_data[ii].r = oldim->im.short_data[ii] ;
00040 break ;
00041
00042 case MRI_int:
00043 for( ii=0 ; ii < npix ; ii++ )
00044 newim->im.complex_data[ii].r = oldim->im.int_data[ii] ;
00045 break ;
00046
00047 case MRI_float:
00048 for( ii=0 ; ii < npix ; ii++ )
00049 newim->im.complex_data[ii].r = oldim->im.float_data[ii] ;
00050 break ;
00051
00052 case MRI_double:
00053 for( ii=0 ; ii < npix ; ii++ )
00054 newim->im.complex_data[ii].r = oldim->im.double_data[ii] ;
00055 break ;
00056
00057 case MRI_complex:
00058 #ifdef DONT_USE_MEMCPY
00059 for( ii=0 ; ii < npix ; ii++ )
00060 newim->im.complex_data[ii] = oldim->im.complex_data[ii] ;
00061 #else
00062 (void) memcpy( newim->im.complex_data ,
00063 oldim->im.complex_data , sizeof(complex)*npix ) ;
00064 #endif
00065 break ;
00066
00067 case MRI_rgb:{
00068 byte * rgb = MRI_RGB_PTR(oldim) ;
00069 complex * car = MRI_COMPLEX_PTR(newim) ;
00070 for( ii=0 ; ii < npix ; ii++ ){
00071 car[ii].r = 0.299 * rgb[3*ii]
00072 + 0.587 * rgb[3*ii+1]
00073 + 0.114 * rgb[3*ii+2] ;
00074 car[ii].i = 0.0 ;
00075 }
00076 }
00077 break ;
00078
00079 default:
00080 fprintf( stderr , "mri_to_complex: unrecognized image kind\n" ) ;
00081 MRI_FATAL_ERROR ;
00082 }
00083
00084 if( oldim->kind != MRI_complex ){
00085 for( ii=0 ; ii < npix ; ii++ )
00086 newim->im.complex_data[ii].i = 0.0 ;
00087 }
00088
00089 MRI_COPY_AUX(newim,oldim) ;
00090 RETURN( newim );
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100 MRI_IMAGE *mri_to_complex_ext( MRI_IMAGE *oldim, int xnew, int ynew, int altern )
00101 {
00102 MRI_IMAGE *newim ;
00103 int oldx,oldy , itop,jtop , ii,jj , jbold,jbnew ;
00104
00105 ENTRY("mri_to_complex_ext") ;
00106
00107 if( oldim == NULL ) RETURN( NULL );
00108
00109 if( ! MRI_IS_2D(oldim) ){
00110 fprintf(stderr,"\n*** mri_to_complex_ext only works on 2D images\n") ;
00111 RETURN( NULL );
00112 }
00113
00114 oldx = oldim->nx ;
00115 oldy = oldim->ny ;
00116
00117 itop = (xnew<oldx) ? xnew : oldx ;
00118 jtop = (ynew<oldy) ? ynew : oldy ;
00119
00120 newim = mri_new( xnew , ynew , MRI_complex ) ;
00121
00122
00123
00124 for( jj=0 ; jj < jtop ; jj++ ){
00125 jbold = oldx * jj ;
00126 jbnew = xnew * jj ;
00127 for( ii=0 ; ii < itop ; ii++ ){
00128 newim->im.complex_data[ii+jbnew].i = 0.0 ;
00129
00130 switch( oldim->kind ){
00131 case MRI_byte:
00132 newim->im.complex_data[ii+jbnew].r =
00133 oldim->im.byte_data[ii+jbold] ;
00134 break ;
00135 case MRI_short:
00136 newim->im.complex_data[ii+jbnew].r =
00137 oldim->im.short_data[ii+jbold] ;
00138 break ;
00139 case MRI_int:
00140 newim->im.complex_data[ii+jbnew].r =
00141 oldim->im.int_data[ii+jbold] ;
00142 break ;
00143 case MRI_float:
00144 newim->im.complex_data[ii+jbnew].r =
00145 oldim->im.float_data[ii+jbold] ;
00146 break ;
00147 case MRI_double:
00148 newim->im.complex_data[ii+jbnew].r =
00149 oldim->im.double_data[ii+jbold] ;
00150 break ;
00151 case MRI_complex:
00152 newim->im.complex_data[ii+jbnew] =
00153 oldim->im.complex_data[ii+jbold] ;
00154 break ;
00155 }
00156 }
00157 }
00158
00159
00160
00161 if( oldx < xnew ){
00162 for( jj=0 ; jj < jtop ; jj++ ){
00163 jbnew = jj * xnew ;
00164 for( ii=oldx ; ii < xnew ; ii++ ){
00165 newim->im.complex_data[ii+jbnew].r = 0.0 ;
00166 newim->im.complex_data[ii+jbnew].i = 0.0 ;
00167 }
00168 }
00169 }
00170
00171
00172
00173 for( jj=oldy ; jj < ynew ; jj++ ){
00174 jbnew = jj * xnew ;
00175 for( ii=0 ; ii < xnew ; ii++ ){
00176 newim->im.complex_data[ii+jbnew].r = 0.0 ;
00177 newim->im.complex_data[ii+jbnew].i = 0.0 ;
00178 }
00179 }
00180
00181 if( altern ){
00182 for( jj=0 ; jj < ynew ; jj++ ){
00183 jbnew = jj * xnew ;
00184 for( ii=0 ; ii < xnew ; ii++ ){
00185 if( (ii+jj)%2 ){
00186 newim->im.complex_data[ii+jbnew].r = - newim->im.complex_data[ii+jbnew].r ;
00187 newim->im.complex_data[ii+jbnew].i = - newim->im.complex_data[ii+jbnew].i ;
00188 }
00189 }
00190 }
00191 }
00192
00193 MRI_COPY_AUX(newim,oldim) ;
00194 RETURN( newim );
00195 }
00196
00197
00198
00199 MRI_IMAGE * mri_pair_to_complex( MRI_IMAGE * rim , MRI_IMAGE * iim )
00200 {
00201 MRI_IMAGE * cim , * rfim , * ifim ;
00202 register complex * car ;
00203 register float * rar , * iar ;
00204 register int ii , nvox ;
00205
00206 ENTRY("mri_pair_to_complex") ;
00207
00208 if( rim == NULL || iim == NULL || rim->nvox != iim->nvox ) RETURN( NULL );
00209
00210 cim = mri_new_conforming( rim , MRI_complex ) ;
00211 car = MRI_COMPLEX_PTR(cim) ;
00212
00213 rfim = (rim->kind == MRI_float) ? rim : mri_to_float( rim ) ;
00214 ifim = (iim->kind == MRI_float) ? iim : mri_to_float( iim ) ;
00215
00216 rar = MRI_FLOAT_PTR(rfim) ; iar = MRI_FLOAT_PTR(ifim) ;
00217 nvox = rfim->nvox ;
00218
00219 for( ii=0 ; ii < nvox ; ii++ ){ car[ii].r = rar[ii] ; car[ii].i = iar[ii] ; }
00220
00221 if( rfim != rim ) mri_free( rfim ) ;
00222 if( ifim != iim ) mri_free( ifim ) ;
00223
00224 RETURN( cim );
00225 }
00226
00227
00228
00229 MRI_IMARR * mri_complex_to_pair( MRI_IMAGE * cim )
00230 {
00231 MRI_IMARR * imarr ;
00232 MRI_IMAGE * rim , * iim ;
00233 register int ii , nvox ;
00234 register float * rar , * iar ;
00235 register complex * car ;
00236
00237 ENTRY("mri_complex_to_pair") ;
00238
00239 if( cim == NULL || cim->kind != MRI_complex ) RETURN( NULL );
00240
00241 rim = mri_new_conforming( cim , MRI_float ) ; rar = MRI_FLOAT_PTR(rim) ;
00242 iim = mri_new_conforming( cim , MRI_float ) ; iar = MRI_FLOAT_PTR(iim) ;
00243 car = MRI_COMPLEX_PTR(cim) ;
00244 nvox = cim->nvox ;
00245
00246 for( ii=0 ; ii < nvox ; ii++ ){ rar[ii] = car[ii].r ; iar[ii] = car[ii].i ; }
00247
00248 INIT_IMARR(imarr) ;
00249 ADDTO_IMARR(imarr,rim) ;
00250 ADDTO_IMARR(imarr,iim) ;
00251
00252 RETURN( imarr );
00253 }