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(). |