Doxygen Source Code Documentation
mri_align.c File Reference
#include "mrilib.h"#include "pcor.h"Go to the source code of this file.
| Defines | |
| #define | REF_FLOAT_SINGLE | 
| #define | DFILT_SIGMA (4.0*0.42466090) | 
| #define | MAX_ITER 5 | 
| #define | DXY_THRESH 0.15 | 
| #define | PHI_THRESH 0.45 | 
| #define | DFAC (PI/180.0) | 
| #define | FINE_FIT | 
| #define | FINE_SIGMA (1.0*0.42466090) | 
| #define | FINE_DXY_THRESH 0.07 | 
| #define | FINE_PHI_THRESH 0.21 | 
| #define | USE_DELAYED_FIT | 
| #define | MRI_ROTA_COARSE(a, b, c, d) mri_rota_variable(almode_coarse,(a),(b),(c),(d)) | 
| #define | MRI_ROTA_FINE(a, b, c, d) mri_rota_variable(almode_fine ,(a),(b),(c),(d)) | 
| #define | MRI_ROTA_REG(a, b, c, d) mri_rota_variable(almode_reg ,(a),(b),(c),(d)) | 
| Functions | |
| void | mri_align_params (int maxite, float sig, float dxy, float dph, float fsig, float fdxy, float fdph) | 
| void | mri_align_method (int coarse, int fine, int reg) | 
| MRI_IMARR * | mri_align_dfspace (MRI_IMAGE *imbase, MRI_IMAGE *imwt, MRI_IMARR *ims, int code, float dx[], float dy[], float phi[]) | 
| Variables | |
| float | dfilt_sigma = DFILT_SIGMA | 
| float | dxy_thresh = DXY_THRESH | 
| float | phi_thresh = PHI_THRESH | 
| float | fine_sigma = FINE_SIGMA | 
| float | fine_dxy_thresh = FINE_DXY_THRESH | 
| float | fine_phi_thresh = FINE_PHI_THRESH | 
| int | max_iter = MAX_ITER | 
| int | almode_coarse = MRI_BICUBIC | 
| int | almode_fine = MRI_BICUBIC | 
| int | almode_reg = MRI_BICUBIC | 
Define Documentation
| 
 | 
| 
 Definition at line 19 of file mri_align.c. Referenced by mri_align_dfspace(). | 
| 
 | 
| 
 Definition at line 15 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| 
 Definition at line 17 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| 
 Definition at line 30 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| FINE_FIT: experimental code for a less smoothed fit at the end RW Cox, 17 July 1995 Definition at line 26 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 31 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| 
 Definition at line 29 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 16 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| 
 Definition at line 71 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 72 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 73 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 18 of file mri_align.c. Referenced by mri_align_params(). | 
| 
 | 
| 
 Definition at line 11 of file mri_align.c. | 
| 
 | 
| 
 Definition at line 34 of file mri_align.c. | 
Function Documentation
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 107 of file mri_align.c. References ADDTO_IMARR, ALIGN_DEBUG_CODE, ALIGN_NOITER_CODE, ALIGN_REGISTER_CODE, ALIGN_VERBOSE_CODE, DESTROY_IMARR, DFAC, dfilt_sigma, dxy_thresh, EXIT, FILT_FFT_WRAPAROUND, fine_dxy_thresh, fine_phi_thresh, fine_sigma, fit, free, MRI_IMARR::imarr, imbase, INIT_IMARR, max_iter, mri_data_pointer(), mri_delayed_lsqfit(), mri_filt_fft(), MRI_FLOAT_PTR, mri_free(), MRI_IS_2D, mri_lsqfit(), mri_new(), MRI_ROTA_COARSE, MRI_ROTA_FINE, MRI_ROTA_REG, mri_startup_lsqfit(), mri_to_float(), MRI_IMAGE::name, MRI_IMARR::num, MRI_IMAGE::nx, MRI_IMAGE::ny, and phi_thresh. 
 00110 {
00111    MRI_IMAGE * im1 , *bim,*xim,*yim,*tim , *bim2 , * im2 , *imww ;
00112    MRI_IMARR * fitim ;
00113    float * fit , *tar,*xar,*yar , *dfit ;
00114    int nx,ny, ii,jj, joff, iter, good, kim, debug, verbose ;
00115    float hnx,hny ;
00116    double * chol_fitim=NULL ;
00117 
00118 #ifdef FINE_FIT
00119    MRI_IMARR * fine_fitim  =NULL ;
00120    MRI_IMAGE * fine_imww   =NULL ;
00121    double * chol_fine_fitim=NULL ;
00122    int use_fine_fit = (fine_sigma > 0.0) ;
00123 #endif
00124 
00125    if( ! MRI_IS_2D(imbase) ){
00126       fprintf(stderr,"\n*** mri_align_dfspace: cannot use nD images!\a\n") ;
00127       EXIT(1) ;
00128    }
00129 
00130    debug    = (code & ALIGN_DEBUG_CODE)    != 0 ;
00131    verbose  = (code & ALIGN_VERBOSE_CODE)  != 0 && !debug ;
00132 
00133    if( verbose ){printf("-- mri_align_dfspace");fflush(stdout);}
00134 
00135    /** create the fitting images **/
00136 
00137    if( debug ){
00138       printf("-- mri_align_dfspace: code=%d\n",code);
00139       if( imbase->name != NULL )
00140         printf("-- imbase name = %s\n",imbase->name);
00141    }
00142 
00143    im1 = mri_to_float( imbase ) ;
00144    nx  = im1->nx ;  hnx = 0.5 * nx ;
00145    ny  = im1->ny ;  hny = 0.5 * ny ;
00146 
00147    bim = mri_filt_fft( im1 , dfilt_sigma , 0 , 0 , FILT_FFT_WRAPAROUND ) ;  /* smooth */
00148    xim = mri_filt_fft( im1 , dfilt_sigma , 1 , 0 , FILT_FFT_WRAPAROUND ) ;  /* d/dx */
00149    yim = mri_filt_fft( im1 , dfilt_sigma , 0 , 1 , FILT_FFT_WRAPAROUND ) ;  /* d/dy */
00150 
00151    tim = mri_new( nx , ny , MRI_float ) ;    /* x * d/dy - y * d/dx */
00152    tar = mri_data_pointer( tim ) ;           /* which is d/d(theta) */
00153    xar = mri_data_pointer( xim ) ;
00154    yar = mri_data_pointer( yim ) ;
00155    for( jj=0 ; jj < ny ; jj++ ){
00156       joff = jj * nx ;
00157       for( ii=0 ; ii < nx ; ii++ ){
00158          tar[ii+joff] = DFAC * (  (ii-hnx) * yar[ii+joff]
00159                                 - (jj-hny) * xar[ii+joff] ) ;
00160       }
00161    }
00162    INIT_IMARR ( fitim ) ;
00163    ADDTO_IMARR( fitim , bim ) ;
00164    ADDTO_IMARR( fitim , xim ) ;
00165    ADDTO_IMARR( fitim , yim ) ;
00166    ADDTO_IMARR( fitim , tim ) ;
00167 
00168    if( imwt == NULL ) imww = mri_to_float( bim ) ;  /* 28 Oct 1996 */
00169    else               imww = mri_to_float( imwt ) ;
00170 
00171    tar = MRI_FLOAT_PTR(imww) ;
00172    for( ii=0 ; ii < nx*ny ; ii++ ) tar[ii] = fabs(tar[ii]) ;  /* 16 Nov 1998 */
00173 
00174 #ifdef USE_DELAYED_FIT
00175    chol_fitim = mri_startup_lsqfit( fitim , imww ) ;
00176 #endif
00177 
00178    /*** create the FINE_FIT analog of the above, if required ***/
00179 #ifdef FINE_FIT
00180    if( use_fine_fit ){
00181      bim = mri_filt_fft( im1 , fine_sigma , 0 , 0 , FILT_FFT_WRAPAROUND ) ;  /* smooth */
00182      xim = mri_filt_fft( im1 , fine_sigma , 1 , 0 , FILT_FFT_WRAPAROUND ) ;  /* d/dx */
00183      yim = mri_filt_fft( im1 , fine_sigma , 0 , 1 , FILT_FFT_WRAPAROUND ) ;  /* d/dy */
00184 
00185      tim = mri_new( nx , ny , MRI_float ) ;    /* x * d/dy - y * d/dx */
00186      tar = mri_data_pointer( tim ) ;           /* which is d/d(theta) */
00187      xar = mri_data_pointer( xim ) ;
00188      yar = mri_data_pointer( yim ) ;
00189      for( jj=0 ; jj < ny ; jj++ ){
00190         joff = jj * nx ;
00191         for( ii=0 ; ii < nx ; ii++ ){
00192            tar[ii+joff] = DFAC * (  (ii-hnx) * yar[ii+joff]
00193                                   - (jj-hny) * xar[ii+joff] ) ;
00194         }
00195      }
00196      INIT_IMARR ( fine_fitim ) ;
00197      ADDTO_IMARR( fine_fitim , bim ) ;
00198      ADDTO_IMARR( fine_fitim , xim ) ;
00199      ADDTO_IMARR( fine_fitim , yim ) ;
00200      ADDTO_IMARR( fine_fitim , tim ) ;
00201 
00202      if( imwt == NULL ) fine_imww = mri_to_float( bim ) ;  /* 03 Oct 1997 */
00203      else               fine_imww = mri_to_float( imwt ) ;
00204 
00205      tar = MRI_FLOAT_PTR(fine_imww) ;
00206      for( ii=0 ; ii < nx*ny ; ii++ ) tar[ii] = fabs(tar[ii]) ;
00207 
00208 #ifdef USE_DELAYED_FIT
00209      chol_fine_fitim = mri_startup_lsqfit( fine_fitim , fine_imww ) ;
00210 #endif
00211    }
00212 #endif  /* FINE_FIT */
00213 
00214    mri_free( im1 ) ;
00215 
00216    /** fit each image to the fitting images **/
00217 
00218    for( kim=0 ; kim < ims->num ; kim++ ){
00219 
00220       if( verbose && kim%5 == 0 ){printf(".");fflush(stdout);}
00221 
00222       if( debug ) printf("-- Start image %d: %s\n",kim,
00223                          (ims->imarr[kim]->name==NULL)?" ":ims->imarr[kim]->name);
00224 
00225       im2  = mri_to_float( ims->imarr[kim] ) ;
00226       bim2 = mri_filt_fft( im2 , dfilt_sigma , 0 , 0 , FILT_FFT_WRAPAROUND ) ;
00227 #ifdef USE_DELAYED_FIT
00228       fit  = mri_delayed_lsqfit( bim2 , fitim , chol_fitim ) ;
00229 #else
00230       fit  = mri_lsqfit( bim2 , fitim , imww ) ;
00231 #endif
00232       mri_free( bim2 ) ;
00233 
00234       if( debug ) printf("   fit = %13.6g %13.6g %13.6g\n",
00235                          fit[1],fit[2],fit[3] ) ;
00236 
00237       iter = 0 ;
00238       good = ( fabs(fit[1]) > dxy_thresh ||
00239                fabs(fit[2]) > dxy_thresh || fabs(fit[3]) > phi_thresh ) &&
00240              ( (code & ALIGN_NOITER_CODE) == 0 ) ;
00241 
00242       while( good ){
00243          tim  = MRI_ROTA_COARSE( im2 , fit[1] , fit[2] , fit[3]*DFAC ) ;
00244          bim2 = mri_filt_fft( tim , dfilt_sigma , 0 , 0 , FILT_FFT_WRAPAROUND ) ;
00245 #ifdef USE_DELAYED_FIT
00246          dfit = mri_delayed_lsqfit( bim2 , fitim , chol_fitim ) ;
00247 #else
00248          dfit = mri_lsqfit( bim2 , fitim , imww ) ;
00249 #endif
00250          mri_free( bim2 ) ; mri_free( tim ) ;
00251 
00252          if( debug )
00253             printf(" Cdfit = %13.6g %13.6g %13.6g\n",
00254                    dfit[1],dfit[2],dfit[3] ) ;
00255 
00256          fit[1] += dfit[1] ;
00257          fit[2] += dfit[2] ;
00258          fit[3] += dfit[3] ;
00259 
00260          good = (++iter < max_iter) &&
00261                   ( fabs(dfit[1]) > dxy_thresh ||
00262                     fabs(dfit[2]) > dxy_thresh || fabs(dfit[3]) > phi_thresh ) ;
00263 
00264          free(dfit) ; dfit = NULL ;
00265       } /* end while */
00266 
00267       /*** perform fine adjustments (always use bicubic interpolation) ***/
00268 #ifdef FINE_FIT
00269       if( use_fine_fit && iter < max_iter && (code & ALIGN_NOITER_CODE) == 0 ){
00270          good = 1 ;
00271          while( good ){
00272             tim  = MRI_ROTA_FINE( im2 , fit[1] , fit[2] , fit[3]*DFAC ) ;
00273             bim2 = mri_filt_fft( tim , fine_sigma , 0 , 0 , FILT_FFT_WRAPAROUND ) ;
00274 #ifdef USE_DELAYED_FIT
00275             dfit = mri_delayed_lsqfit( bim2 , fine_fitim , chol_fine_fitim ) ;
00276 #else
00277             dfit = mri_lsqfit( bim2 , fine_fitim , fine_imww ) ;
00278 #endif
00279             mri_free( bim2 ) ; mri_free( tim ) ;
00280 
00281             if( debug )
00282                printf(" Fdfit = %13.6g %13.6g %13.6g\n",
00283                       dfit[1],dfit[2],dfit[3] ) ;
00284 
00285             fit[1] += dfit[1] ;
00286             fit[2] += dfit[2] ;
00287             fit[3] += dfit[3] ;
00288 
00289             good = (++iter < max_iter) &&
00290                      ( fabs(dfit[1]) > fine_dxy_thresh ||
00291                        fabs(dfit[2]) > fine_dxy_thresh || fabs(dfit[3]) > fine_phi_thresh ) ;
00292 
00293             free(dfit) ; dfit = NULL ;
00294          } /* end while */
00295       }
00296 #endif
00297 
00298       dx[kim]  = fit[1] ;
00299       dy[kim]  = fit[2] ;
00300       phi[kim] = fit[3]*DFAC ;
00301 
00302       if( debug )
00303          printf("   FIT = %13.6g %13.6g %13.6g\n",
00304                 fit[1],fit[2],fit[3] ) ;
00305 
00306       free(fit) ; fit = NULL ; mri_free( im2 ) ;
00307    }
00308 
00309    if( verbose ){printf("\n");fflush(stdout);}
00310 
00311    DESTROY_IMARR( fitim ) ;
00312 #ifdef USE_DELAYED_FIT
00313    free(chol_fitim) ; chol_fitim = NULL ;
00314 #endif
00315 
00316 #ifdef FINE_FIT
00317    if( use_fine_fit ){
00318      DESTROY_IMARR( fine_fitim ) ;
00319      mri_free( fine_imww ) ;
00320 #ifdef USE_DELAYED_FIT
00321      free(chol_fine_fitim) ; chol_fine_fitim = NULL ;
00322 #endif
00323    }
00324 #endif
00325 
00326    mri_free( imww ) ;
00327 
00328    if( (code & ALIGN_REGISTER_CODE) == 0 ) return NULL ;
00329 
00330    /** do the actual registration, if ordered (is always bicubic) **/
00331 
00332    INIT_IMARR( fitim ) ;
00333 
00334    if( verbose ){printf("-- registering");fflush(stdout);}
00335 
00336    for( kim=0 ; kim < ims->num ; kim++ ){
00337       tim = MRI_ROTA_REG( ims->imarr[kim] , dx[kim],dy[kim],phi[kim] ) ;
00338       ADDTO_IMARR( fitim , tim ) ;
00339       if( verbose && kim%5 == 0 ){printf(".");fflush(stdout);}
00340    }
00341 
00342    if( verbose ){printf("\n");fflush(stdout);}
00343 
00344    return fitim ;
00345 }
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 75 of file mri_align.c. References almode_coarse, almode_fine, and almode_reg. Referenced by REG_command_line(). 
 00076 {
00077    if( coarse > 0 ) almode_coarse = coarse ;
00078    if( fine   > 0 ) almode_fine   = fine   ;
00079    if( reg    > 0 ) almode_reg    = reg    ;
00080    return ;
00081 }
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 50 of file mri_align.c. References dfilt_sigma, DFILT_SIGMA, dxy_thresh, DXY_THRESH, fine_dxy_thresh, FINE_DXY_THRESH, fine_phi_thresh, FINE_PHI_THRESH, fine_sigma, max_iter, MAX_ITER, phi_thresh, and PHI_THRESH. Referenced by IMREG_main(), and REG_command_line(). 
 00053 {
00054    if( maxite > 0   ) max_iter    = maxite ; else max_iter    = MAX_ITER    ;
00055    if( sig    > 0.0 ) dfilt_sigma = sig    ; else dfilt_sigma = DFILT_SIGMA ;
00056    if( dxy    > 0.0 ) dxy_thresh  = dxy    ; else dxy_thresh  = DXY_THRESH  ;
00057    if( dph    > 0.0 ) phi_thresh  = dph    ; else phi_thresh  = PHI_THRESH  ;
00058 
00059    fine_sigma = fsig ;
00060    if( fdxy > 0.0 ) fine_dxy_thresh = fdxy ; else fine_dxy_thresh = FINE_DXY_THRESH ;
00061    if( fdph > 0.0 ) fine_phi_thresh = fdph ; else fine_phi_thresh = FINE_PHI_THRESH ;
00062 
00063    return ;
00064 }
 | 
Variable Documentation
| 
 | 
| 
 Definition at line 67 of file mri_align.c. Referenced by mri_align_method(). | 
| 
 | 
| 
 Definition at line 68 of file mri_align.c. Referenced by mri_align_method(). | 
| 
 | 
| 
 Definition at line 69 of file mri_align.c. Referenced by mri_align_method(). | 
| 
 | 
| 
 Definition at line 41 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 42 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 45 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 46 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 44 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 48 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
| 
 | 
| 
 Definition at line 43 of file mri_align.c. Referenced by mri_align_dfspace(), and mri_align_params(). | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  