Doxygen Source Code Documentation
mri_2dalign.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#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 | 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_2dalign_params (int maxite, float sig, float dxy, float dph, float fsig, float fdxy, float fdph) |
void | mri_2dalign_method (int coarse, int fine, int reg) |
MRI_2dalign_basis * | mri_2dalign_setup (MRI_IMAGE *imbase, MRI_IMAGE *imwt) |
MRI_IMAGE * | mri_2dalign_one (MRI_2dalign_basis *basis, MRI_IMAGE *im, float *dx, float *dy, float *phi) |
MRI_IMARR * | mri_2dalign_many (MRI_IMAGE *im, MRI_IMAGE *imwt, MRI_IMARR *ims, float *dx, float *dy, float *phi) |
void | mri_2dalign_cleanup (MRI_2dalign_basis *basis) |
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_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_setup(). |
|
Definition at line 15 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
|
Definition at line 17 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
|
Definition at line 24 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
|
Definition at line 21 of file mri_2dalign.c. |
|
Definition at line 25 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
|
Definition at line 23 of file mri_2dalign.c. |
|
Definition at line 16 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
|
Definition at line 62 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_align_dfspace(). |
|
Definition at line 63 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_align_dfspace(). |
|
Definition at line 64 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_align_dfspace(). |
|
Definition at line 18 of file mri_2dalign.c. Referenced by mri_2dalign_params(). |
Function Documentation
|
Definition at line 296 of file mri_2dalign.c. References MRI_2dalign_basis::chol_fine_fitim, MRI_2dalign_basis::chol_fitim, DESTROY_IMARR, MRI_2dalign_basis::fine_fitim, MRI_2dalign_basis::fitim, and free. Referenced by cleanup_rtinp(), mri_2dalign_many(), and RT_registration_2D_close().
00297 { 00298 if( basis == NULL ) return ; 00299 00300 if( basis->fitim != NULL ){ DESTROY_IMARR( basis->fitim ) ; } 00301 if( basis->chol_fitim != NULL ){ free(basis->chol_fitim) ; } 00302 00303 if( basis->fine_fitim != NULL ){ DESTROY_IMARR( basis->fine_fitim ) ; } 00304 if( basis->chol_fine_fitim != NULL ){ free(basis->chol_fine_fitim) ; } 00305 00306 free(basis) ; return ; 00307 } |
|
Definition at line 274 of file mri_2dalign.c. References ADDTO_IMARR, MRI_IMARR::imarr, INIT_IMARR, mri_2dalign_cleanup(), mri_2dalign_one(), mri_2dalign_setup(), and MRI_IMARR::num. Referenced by main().
00276 { 00277 int kim ; 00278 MRI_IMAGE * tim ; 00279 MRI_IMARR * alim ; 00280 MRI_2dalign_basis * basis ; 00281 00282 basis = mri_2dalign_setup( im , imwt ) ; 00283 if( basis == NULL ) return NULL ; 00284 00285 INIT_IMARR( alim ) ; 00286 00287 for( kim=0 ; kim < ims->num ; kim++ ){ 00288 tim = mri_2dalign_one( basis , ims->imarr[kim] , dx+kim , dy+kim , phi+kim ) ; 00289 ADDTO_IMARR(alim,tim) ; 00290 } 00291 00292 mri_2dalign_cleanup( basis ) ; 00293 return alim ; 00294 } |
|
Definition at line 66 of file mri_2dalign.c. References almode_coarse, almode_fine, and almode_reg. Referenced by RT_registration_2D_setup().
00067 { 00068 if( coarse > 0 ) almode_coarse = coarse ; 00069 if( fine > 0 ) almode_fine = fine ; 00070 if( reg > 0 ) almode_reg = reg ; 00071 return ; 00072 } |
|
Definition at line 189 of file mri_2dalign.c. References MRI_2dalign_basis::chol_fine_fitim, MRI_2dalign_basis::chol_fitim, DFAC, dfilt_sigma, dxy_thresh, FILT_FFT_WRAPAROUND, fine_dxy_thresh, MRI_2dalign_basis::fine_fitim, fine_phi_thresh, fine_sigma, fit, MRI_2dalign_basis::fitim, free, max_iter, mri_delayed_lsqfit(), mri_filt_fft(), mri_free(), MRI_ROTA_COARSE, MRI_ROTA_FINE, MRI_ROTA_REG, mri_to_float(), MRI_IMAGE::nx, MRI_IMAGE::ny, and phi_thresh. Referenced by mri_2dalign_many(), and RT_registration_2D_onevol().
00191 { 00192 MRI_IMARR * fitim ; 00193 double * chol_fitim=NULL ; 00194 MRI_IMARR * fine_fitim =NULL ; 00195 double * chol_fine_fitim=NULL ; 00196 00197 float * fit , *dfit ; 00198 int nx,ny , ii,jj , joff , iter , good ; 00199 int use_fine_fit = (fine_sigma > 0.0) ; 00200 MRI_IMAGE * im2 , * bim2 , * tim ; 00201 00202 nx = im->nx ; ny = im->ny ; 00203 00204 fitim = basis->fitim ; 00205 chol_fitim = basis->chol_fitim ; 00206 fine_fitim = basis->fine_fitim ; 00207 chol_fine_fitim = basis->chol_fine_fitim ; 00208 00209 /*-- register the image: coarsely --*/ 00210 00211 im2 = mri_to_float( im ) ; 00212 bim2 = mri_filt_fft( im2, dfilt_sigma, 0,0, FILT_FFT_WRAPAROUND ) ; 00213 fit = mri_delayed_lsqfit( bim2 , fitim , chol_fitim ) ; 00214 mri_free( bim2 ) ; 00215 00216 iter = 0 ; 00217 good = ( fabs(fit[1]) > dxy_thresh || 00218 fabs(fit[2]) > dxy_thresh || fabs(fit[3]) > phi_thresh ) ; 00219 00220 /*-- iterate coarse fit --*/ 00221 00222 while( good ){ 00223 tim = MRI_ROTA_COARSE( im2 , fit[1] , fit[2] , fit[3]*DFAC ) ; 00224 bim2 = mri_filt_fft( tim, dfilt_sigma, 0,0, FILT_FFT_WRAPAROUND ) ; 00225 dfit = mri_delayed_lsqfit( bim2 , fitim , chol_fitim ) ; 00226 mri_free( bim2 ) ; mri_free( tim ) ; 00227 00228 fit[1] += dfit[1] ; 00229 fit[2] += dfit[2] ; 00230 fit[3] += dfit[3] ; 00231 00232 good = (++iter < max_iter) && 00233 ( fabs(dfit[1]) > dxy_thresh || 00234 fabs(dfit[2]) > dxy_thresh || fabs(dfit[3]) > phi_thresh ) ; 00235 00236 free(dfit) ; dfit = NULL ; 00237 } /* end while */ 00238 00239 /*-- perform fine adjustments --*/ 00240 00241 if( use_fine_fit ){ 00242 good = 1 ; 00243 while( good ){ 00244 tim = MRI_ROTA_FINE( im2 , fit[1] , fit[2] , fit[3]*DFAC ) ; 00245 bim2 = mri_filt_fft( tim, fine_sigma, 0,0, FILT_FFT_WRAPAROUND ) ; 00246 dfit = mri_delayed_lsqfit( bim2 , fine_fitim , chol_fine_fitim ) ; 00247 mri_free( bim2 ) ; mri_free( tim ) ; 00248 00249 fit[1] += dfit[1] ; 00250 fit[2] += dfit[2] ; 00251 fit[3] += dfit[3] ; 00252 00253 good = (++iter < max_iter) && 00254 ( fabs(dfit[1]) > fine_dxy_thresh || 00255 fabs(dfit[2]) > fine_dxy_thresh || fabs(dfit[3]) > fine_phi_thresh ) ; 00256 00257 free(dfit) ; dfit = NULL ; 00258 } /* end while */ 00259 } 00260 00261 /*-- save final alignment parameters --*/ 00262 00263 if( dx != NULL ) *dx = fit[1] ; 00264 if( dy != NULL ) *dy = fit[2] ; 00265 if( phi!= NULL ) *phi= fit[3]*DFAC ; 00266 00267 /*-- do the actual realignment --*/ 00268 00269 tim = MRI_ROTA_REG( im2 , fit[1],fit[2],fit[3]*DFAC ) ; 00270 mri_free( im2 ) ; 00271 return tim ; 00272 } |
|
Definition at line 41 of file mri_2dalign.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 REG_command_line().
00044 { 00045 if( maxite > 0 ) max_iter = maxite ; else max_iter = MAX_ITER ; 00046 if( sig > 0.0 ) dfilt_sigma = sig ; else dfilt_sigma = DFILT_SIGMA ; 00047 if( dxy > 0.0 ) dxy_thresh = dxy ; else dxy_thresh = DXY_THRESH ; 00048 if( dph > 0.0 ) phi_thresh = dph ; else phi_thresh = PHI_THRESH ; 00049 00050 fine_sigma = fsig ; 00051 if( fdxy > 0.0 ) fine_dxy_thresh = fdxy ; else fine_dxy_thresh = FINE_DXY_THRESH ; 00052 if( fdph > 0.0 ) fine_phi_thresh = fdph ; else fine_phi_thresh = FINE_PHI_THRESH ; 00053 00054 return ; 00055 } |
|
Definition at line 85 of file mri_2dalign.c. References ADDTO_IMARR, MRI_2dalign_basis::chol_fine_fitim, MRI_2dalign_basis::chol_fitim, DFAC, dfilt_sigma, FILT_FFT_WRAPAROUND, MRI_2dalign_basis::fine_fitim, fine_sigma, MRI_2dalign_basis::fitim, imbase, INIT_IMARR, malloc, mri_data_pointer(), mri_filt_fft(), MRI_FLOAT_PTR, mri_free(), MRI_IS_2D, mri_new(), mri_startup_lsqfit(), mri_to_float(), MRI_IMAGE::nx, and MRI_IMAGE::ny. Referenced by mri_2dalign_many(), and RT_registration_2D_setup().
00086 { 00087 MRI_IMAGE * im1 , *bim,*xim,*yim,*tim , *bim2 , * im2 , *imww ; 00088 float *tar,*xar,*yar ; 00089 int nx,ny , ii,jj , joff ; 00090 int use_fine_fit = (fine_sigma > 0.0) ; 00091 float hnx,hny ; 00092 00093 MRI_IMARR * fitim =NULL; 00094 double * chol_fitim=NULL ; 00095 MRI_IMARR * fine_fitim =NULL ; 00096 double * chol_fine_fitim=NULL ; 00097 MRI_2dalign_basis * bout = NULL ; 00098 00099 if( ! MRI_IS_2D(imbase) ){ 00100 fprintf(stderr,"\n*** mri_2dalign_setup: cannot use nD images!\a\n") ; 00101 return NULL ; 00102 } 00103 00104 im1 = mri_to_float( imbase ) ; 00105 nx = im1->nx ; hnx = 0.5 * nx ; 00106 ny = im1->ny ; hny = 0.5 * ny ; 00107 00108 bim = mri_filt_fft( im1, dfilt_sigma, 0, 0, FILT_FFT_WRAPAROUND ) ; /* smooth */ 00109 xim = mri_filt_fft( im1, dfilt_sigma, 1, 0, FILT_FFT_WRAPAROUND ) ; /* d/dx */ 00110 yim = mri_filt_fft( im1, dfilt_sigma, 0, 1, FILT_FFT_WRAPAROUND ) ; /* d/dy */ 00111 00112 tim = mri_new( nx , ny , MRI_float ) ; /* x * d/dy - y * d/dx */ 00113 tar = mri_data_pointer( tim ) ; /* which is d/d(theta) */ 00114 xar = mri_data_pointer( xim ) ; 00115 yar = mri_data_pointer( yim ) ; 00116 for( jj=0 ; jj < ny ; jj++ ){ 00117 joff = jj * nx ; 00118 for( ii=0 ; ii < nx ; ii++ ){ 00119 tar[ii+joff] = DFAC * ( (ii-hnx) * yar[ii+joff] 00120 - (jj-hny) * xar[ii+joff] ) ; 00121 } 00122 } 00123 INIT_IMARR ( fitim ) ; 00124 ADDTO_IMARR( fitim , bim ) ; 00125 ADDTO_IMARR( fitim , xim ) ; 00126 ADDTO_IMARR( fitim , yim ) ; 00127 ADDTO_IMARR( fitim , tim ) ; 00128 00129 if( imwt == NULL ) imww = mri_to_float( bim ) ; /* 28 Oct 1996 */ 00130 else imww = mri_to_float( imwt ) ; 00131 00132 tar = MRI_FLOAT_PTR(imww) ; 00133 for( ii=0 ; ii < nx*ny ; ii++ ) tar[ii] = fabs(tar[ii]) ; /* 16 Nov 1998 */ 00134 00135 chol_fitim = mri_startup_lsqfit( fitim , imww ) ; 00136 mri_free(imww) ; 00137 00138 if( use_fine_fit ){ 00139 bim = mri_filt_fft( im1, fine_sigma, 0, 0, FILT_FFT_WRAPAROUND ) ; /* smooth */ 00140 xim = mri_filt_fft( im1, fine_sigma, 1, 0, FILT_FFT_WRAPAROUND ) ; /* d/dx */ 00141 yim = mri_filt_fft( im1, fine_sigma, 0, 1, FILT_FFT_WRAPAROUND ) ; /* d/dy */ 00142 00143 tim = mri_new( nx , ny , MRI_float ) ; /* x * d/dy - y * d/dx */ 00144 tar = mri_data_pointer( tim ) ; /* which is d/d(theta) */ 00145 xar = mri_data_pointer( xim ) ; 00146 yar = mri_data_pointer( yim ) ; 00147 for( jj=0 ; jj < ny ; jj++ ){ 00148 joff = jj * nx ; 00149 for( ii=0 ; ii < nx ; ii++ ){ 00150 tar[ii+joff] = DFAC * ( (ii-hnx) * yar[ii+joff] 00151 - (jj-hny) * xar[ii+joff] ) ; 00152 } 00153 } 00154 INIT_IMARR ( fine_fitim ) ; 00155 ADDTO_IMARR( fine_fitim , bim ) ; 00156 ADDTO_IMARR( fine_fitim , xim ) ; 00157 ADDTO_IMARR( fine_fitim , yim ) ; 00158 ADDTO_IMARR( fine_fitim , tim ) ; 00159 00160 if( imwt == NULL ) imww = mri_to_float( bim ) ; /* 03 Oct 1997 */ 00161 else imww = mri_to_float( imwt ) ; 00162 00163 tar = MRI_FLOAT_PTR(imww) ; 00164 for( ii=0 ; ii < nx*ny ; ii++ ) tar[ii] = fabs(tar[ii]) ; 00165 00166 chol_fine_fitim = mri_startup_lsqfit( fine_fitim , imww ) ; 00167 mri_free(imww) ; 00168 } 00169 00170 mri_free(im1) ; 00171 00172 bout = (MRI_2dalign_basis *) malloc( sizeof(MRI_2dalign_basis) ) ; 00173 bout->fitim = fitim ; 00174 bout->chol_fitim = chol_fitim ; 00175 bout->fine_fitim = fine_fitim ; 00176 bout->chol_fine_fitim = chol_fine_fitim ; 00177 return bout ; 00178 } |
Variable Documentation
|
Definition at line 58 of file mri_2dalign.c. Referenced by mri_2dalign_method(). |
|
Definition at line 59 of file mri_2dalign.c. Referenced by mri_2dalign_method(). |
|
Definition at line 60 of file mri_2dalign.c. Referenced by mri_2dalign_method(). |
|
Definition at line 32 of file mri_2dalign.c. Referenced by mri_2dalign_one(), mri_2dalign_params(), and mri_2dalign_setup(). |
|
Definition at line 33 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_params(). |
|
Definition at line 36 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_params(). |
|
Definition at line 37 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_params(). |
|
Definition at line 35 of file mri_2dalign.c. Referenced by mri_2dalign_one(), mri_2dalign_params(), and mri_2dalign_setup(). |
|
Definition at line 39 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_params(). |
|
Definition at line 34 of file mri_2dalign.c. Referenced by mri_2dalign_one(), and mri_2dalign_params(). |