Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

mri_3dalign.c File Reference

#include "mrilib.h"

Go to the source code of this file.


Defines

#define MAX_ITER   5
#define DXY_THRESH   0.07
#define PHI_THRESH   0.21
#define DFAC   (PI/180.0)
#define DOTRIM   (basis->xa >= 0)
#define IMTRIM(qqq)
#define TRIM(imq)
#define VRANG(str, imq)
#define CLEAR_INITVALS   mri_3dalign_initvals(0.0,0.0,0.0,0.0,0.0,0.0)
#define NONZERO_INITVALS
#define FF(i, j, k)   f[(i)+(j)*nx+(k)*nxy]
#define MEGA   (1024*1024)
#define PK(x)   ( (x!=NULL) ? (x+kim) : NULL )

Functions

void mri_3dalign_wtrimming (int ttt)
void mri_3dalign_wproccing (int ttt)
void mri_3dalign_scaleinit (float ttt)
void mri_3dalign_params (int maxite, float dxy, float dph, float dfac, int bx1, int bx2, int bx3, int dc)
void mri_3dalign_initvals (float th1, float th2, float th3, float dx,float dy,float dz)
void mri_3dalign_method (int rmode, int verb, int norgg, int clip)
void mri_3dalign_blurring (float bl)
void mri_3dalign_final_regmode (int frm)
void mri_3dalign_edging (int x, int y, int z)
void mri_3dalign_force_edging (int n)
void mri_3dalign_edging_default (int nx, int ny, int nz)
MRI_3dalign_basismri_3dalign_setup (MRI_IMAGE *imbase, MRI_IMAGE *imwt)
MRI_IMAGEmri_3dalign_one (MRI_3dalign_basis *basis, MRI_IMAGE *im, float *th1, float *th2, float *th3, float *dx, float *dy, float *dz)
MRI_IMARRmri_3dalign_many (MRI_IMAGE *im, MRI_IMAGE *imwt, MRI_IMARR *ims, float *th1, float *th2, float *th3, float *dx, float *dy, float *dz)
void mri_3dalign_cleanup (MRI_3dalign_basis *basis)

Variables

float dxy_thresh = DXY_THRESH
float phi_thresh = PHI_THRESH
float delfac = 1.5
int max_iter = MAX_ITER
int ax1 = 0
int ax2 = 1
int ax3 = 2
int dcode = -1
int wproc = 0
int wtrim = 0
float sinit = 1.0
float init_dth1 = 0.0
float init_dth2 = 0.0
float init_dth3 = 0.0
float init_dx = 0.0
float init_dy = 0.0
float init_dz = 0.0
int regmode = MRI_QUINTIC
int verbose = 0
int noreg = 0
int clipit = 0
float blurit = 0.0
int final_regmode = -1
int xedge = -1
int yedge = -1
int zedge = -1
int xfade
int yfade
int zfade
int force_edging = 0

Define Documentation

#define CLEAR_INITVALS   mri_3dalign_initvals(0.0,0.0,0.0,0.0,0.0,0.0)
 

Definition at line 89 of file mri_3dalign.c.

#define DFAC   (PI/180.0)
 

Definition at line 18 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_setup().

#define DOTRIM   (basis->xa >= 0)
 

Definition at line 33 of file mri_3dalign.c.

#define DXY_THRESH   0.07
 

Definition at line 16 of file mri_3dalign.c.

Referenced by mri_3dalign_params().

#define FF i,
j,
k       f[(i)+(j)*nx+(k)*nxy]
 

#define IMTRIM qqq   
 

Value:

mri_cut_3D( qqq , basis->xa,basis->xb ,  \
                                      basis->ya,basis->yb ,  \
                                      basis->za,basis->zb  )

Definition at line 35 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_setup().

#define MAX_ITER   5
 

Definition at line 15 of file mri_3dalign.c.

Referenced by mri_3dalign_params().

#define MEGA   (1024*1024)
 

#define NONZERO_INITVALS
 

Value:

( init_dth1 != 0.0 || init_dth2 != 0.0 || init_dth3 != 0.0 ||  \
   init_dx   != 0.0 || init_dy   != 0.0 || init_dz   != 0.0   )

Definition at line 91 of file mri_3dalign.c.

#define PHI_THRESH   0.21
 

Definition at line 17 of file mri_3dalign.c.

Referenced by mri_3dalign_params().

#define PK      ( (x!=NULL) ? (x+kim) : NULL )
 

#define TRIM imq   
 

Value:

do{ if( DOTRIM ){                    \
        MRI_IMAGE *qim = IMTRIM(imq) ; \
        mri_free(imq) ; imq = qim ;    \
  } } while(0)
Macro to replace an image with a trimmed copy, if needed.

Definition at line 41 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_setup().

#define VRANG str,
imq   
 

Value:

do{ if(verbose){                                 \
       double tt=mri_max(imq), bb=mri_min(imq) ;  \
       fprintf(stderr,"  %s range: min=%g  max=%g\n",str,bb,tt); } } while(0)
Macro to print out a volume range in verbose mode.

Definition at line 49 of file mri_3dalign.c.

Referenced by mri_3dalign_setup().


Function Documentation

void mri_3dalign_blurring float    bl
 

Definition at line 121 of file mri_3dalign.c.

References blurit.

00121 { blurit = bl ; return ; }

void mri_3dalign_cleanup MRI_3dalign_basis   basis
 

Definition at line 701 of file mri_3dalign.c.

References MRI_3dalign_basis::chol_fitim, DESTROY_IMARR, ENTRY, MRI_3dalign_basis::fitim, and free.

Referenced by cleanup_rtinp(), mri_3dalign_many(), RT_registration_3D_close(), and VOLREG_main().

00702 {
00703 ENTRY("mri_3dalign_cleanup") ;
00704    if( basis == NULL ) EXRETURN ;
00705 
00706    if( basis->fitim      != NULL ){ DESTROY_IMARR( basis->fitim ) ; }
00707    if( basis->chol_fitim != NULL ){ free(basis->chol_fitim) ; }
00708 
00709    free(basis) ; EXRETURN ;
00710 }

void mri_3dalign_edging int    x,
int    y,
int    z
 

Definition at line 137 of file mri_3dalign.c.

References xedge, yedge, and zedge.

00138 {
00139    xedge = x ; yedge = y ; zedge = z ;
00140 }

void mri_3dalign_edging_default int    nx,
int    ny,
int    nz
 

Definition at line 147 of file mri_3dalign.c.

References MIN, my_getenv(), nz, strtod(), xfade, yfade, and zfade.

Referenced by mri_3dalign_setup().

00148 {
00149    char *ef=my_getenv("AFNI_VOLREG_EDGING") , *eq ;
00150 
00151    if( ef == NULL ){                  /* the 5% solution */
00152       xfade = (int)(0.05*nx+0.5) ;
00153       yfade = (int)(0.05*ny+0.5) ;
00154       zfade = (int)(0.05*nz+0.5) ;
00155    } else {
00156       float ff = strtod(ef,&eq) ;
00157       if( ff < 0 ){                   /* again */
00158          xfade = (int)(0.05*nx+0.5) ;
00159          yfade = (int)(0.05*ny+0.5) ;
00160          zfade = (int)(0.05*nz+0.5) ;
00161       } else {
00162          if( *eq == '%' ){            /* the whatever % solution */
00163             xfade = (int)(0.01*ff*nx+0.5) ;
00164             yfade = (int)(0.01*ff*ny+0.5) ;
00165             zfade = (int)(0.01*ff*nz+0.5) ;
00166          } else {                     /* the fixed value solution */
00167             xfade = (int)( MIN(0.25*nx,ff) ) ;
00168             yfade = (int)( MIN(0.25*ny,ff) ) ;
00169             zfade = (int)( MIN(0.25*nz,ff) ) ;
00170          }
00171       }
00172    }
00173 }

void mri_3dalign_final_regmode int    frm
 

Definition at line 124 of file mri_3dalign.c.

References final_regmode.

Referenced by RT_registration_3D_setup().

00125 {
00126    final_regmode = frm ;
00127    return ;
00128 }

void mri_3dalign_force_edging int    n
 

Definition at line 142 of file mri_3dalign.c.

References force_edging.

00143 {
00144    force_edging = n ;
00145 }

void mri_3dalign_initvals float    th1,
float    th2,
float    th3,
float    dx,
float    dy,
float    dz
 

Definition at line 95 of file mri_3dalign.c.

References init_dth1, init_dth2, init_dth3, init_dx, init_dy, and init_dz.

00097 {
00098    init_dth1 = th1 ; init_dth2 = th2 ; init_dth3 = th3 ;  /* degrees */
00099    init_dx   = dx  ; init_dy   = dy  ; init_dz   = dz  ;  /* mm      */
00100 }

MRI_IMARR* mri_3dalign_many MRI_IMAGE   im,
MRI_IMAGE   imwt,
MRI_IMARR   ims,
float *    th1,
float *    th2,
float *    th3,
float *    dx,
float *    dy,
float *    dz
 

Definition at line 670 of file mri_3dalign.c.

References ADDTO_IMARR, ENTRY, MRI_IMARR::imarr, INIT_IMARR, mri_3dalign_cleanup(), mri_3dalign_one(), mri_3dalign_setup(), MRI_IMARR::num, and RETURN.

00673 {
00674    int kim ;
00675    MRI_IMAGE * tim ;
00676    MRI_IMARR * alim ;
00677    MRI_3dalign_basis * basis ;
00678 
00679 ENTRY("mri_3dalign_many") ;
00680 
00681    basis = mri_3dalign_setup( im , imwt ) ;
00682    if( basis == NULL ) RETURN( NULL );
00683 
00684    INIT_IMARR( alim ) ;
00685 
00686 #define PK(x) ( (x!=NULL) ? (x+kim) : NULL )
00687 
00688    for( kim=0 ; kim < ims->num ; kim++ ){
00689       tim = mri_3dalign_one( basis , ims->imarr[kim] ,
00690                              PK(th1), PK(th2), PK(th3),
00691                              PK(dx) , PK(dy) , PK(dz)  ) ;
00692       ADDTO_IMARR(alim,tim) ;
00693    }
00694 
00695    mri_3dalign_cleanup( basis ) ;
00696    RETURN( alim );
00697 }

void mri_3dalign_method int    rmode,
int    verb,
int    norgg,
int    clip
 

Definition at line 109 of file mri_3dalign.c.

References clipit, noreg, regmode, and verbose.

Referenced by RT_registration_3D_setup(), and VOLREG_main().

00110 {
00111    regmode = rmode ;
00112    verbose = verb ;
00113    noreg   = norgg ;
00114    clipit  = clip ;
00115    return ;
00116 }

MRI_IMAGE* mri_3dalign_one MRI_3dalign_basis   basis,
MRI_IMAGE   im,
float *    th1,
float *    th2,
float *    th3,
float *    dx,
float *    dy,
float *    dz
 

Definition at line 533 of file mri_3dalign.c.

References ax1, ax2, ax3, MRI_3dalign_basis::chol_fitim, clipit, dcode, DFAC, MRI_IMAGE::dx, dxy_thresh, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, fim, final_regmode, fit, MRI_3dalign_basis::fitim, free, IMTRIM, init_dth1, init_dth2, init_dth3, init_dx, init_dy, init_dz, MRI_IMAGE::kind, malloc, max_iter, MRI_CUBIC, mri_delayed_lsqfit(), MRI_FLOAT_PTR, MRI_FOURIER, mri_free(), MRI_HEPTIC, mri_max(), mri_min(), MRI_QUINTIC, mri_to_float(), noreg, MRI_IMAGE::nvox, phi_thresh, regmode, RETURN, THD_rota3D(), THD_rota_method(), and TRIM.

Referenced by mri_3dalign_many(), RT_registration_3D_onevol(), and VOLREG_main().

00536 {
00537    MRI_IMARR * fitim ;
00538    double * chol_fitim=NULL ;
00539    float * fit , *dfit ;
00540    int iter , good , ii ;
00541    float dxt , dyt , dzt , ftop,fbot ;
00542    MRI_IMAGE * tim , * fim ;
00543 
00544 ENTRY("mri_3dalign_one") ;
00545 
00546    fitim      = basis->fitim ;
00547    chol_fitim = basis->chol_fitim ;
00548 
00549    /* use original image if possible */
00550 
00551    if( im->kind == MRI_float ) fim = im ;
00552    else                        fim = mri_to_float( im ) ;
00553 
00554    iter = 0 ;
00555 
00556    THD_rota_method( regmode ) ;
00557 
00558    /* convert displacement threshold from voxels to mm in each direction */
00559 
00560    dxt = (im->dx != 0.0) ? (fabs(im->dx) * dxy_thresh) : dxy_thresh ;
00561    dyt = (im->dy != 0.0) ? (fabs(im->dy) * dxy_thresh) : dxy_thresh ;
00562    dzt = (im->dz != 0.0) ? (fabs(im->dz) * dxy_thresh) : dxy_thresh ;
00563 
00564    if( NONZERO_INITVALS ){                                    /* 04 Sep 2000 */
00565       fit = (float *) malloc(sizeof(float)*7) ;
00566       fit[0] = 1.0 ;
00567       fit[1] = init_dth1; fit[2] = init_dth2; fit[3] = init_dth3; /* degrees */
00568       fit[4] = init_dx  ; fit[5] = init_dy  ; fit[6] = init_dz  ; /* mm      */
00569 
00570       good = 1 ;
00571    } else {
00572 
00573       /* 06 Jun 2002: do initial fit with trimmed image, if ordered */
00574 
00575       if( DOTRIM ){
00576         tim = IMTRIM(fim) ;
00577         fit = mri_delayed_lsqfit( tim , fitim , chol_fitim ) ;
00578         mri_free( tim ) ;
00579       } else {                                /* L2 fit input image */
00580         fit = mri_delayed_lsqfit( fim , fitim , chol_fitim ) ;
00581       }
00582 
00583       good = ( 10.0*fabs(fit[4]) > dxt        || 10.0*fabs(fit[5]) > dyt        ||
00584                10.0*fabs(fit[6]) > dzt        || 10.0*fabs(fit[1]) > phi_thresh ||
00585                10.0*fabs(fit[2]) > phi_thresh || 10.0*fabs(fit[3]) > phi_thresh   ) ;
00586    }
00587 
00588    if( verbose )
00589       fprintf(stderr,
00590              "\nFirst fit: %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n",
00591              fit[0] , fit[1] , fit[2] , fit[3] , fit[4] , fit[5] , fit[6] ) ;
00592 
00593    /*-- iterate fit --*/
00594 
00595    while( good ){
00596       tim = THD_rota3D( fim ,
00597                         ax1,fit[1]*DFAC , ax2,fit[2]*DFAC , ax3,fit[3]*DFAC ,
00598                         dcode , fit[4],fit[5],fit[6] ) ;
00599 
00600       TRIM(tim) ; /* 06 Jun 2002: trim it if ordered to */
00601 
00602       dfit = mri_delayed_lsqfit( tim , fitim , chol_fitim ) ; /* delta angle/shift */
00603       mri_free( tim ) ;
00604 
00605       fit[1] += dfit[1] ; fit[2] += dfit[2] ; fit[3] += dfit[3] ;  /* accumulate  */
00606       fit[4] += dfit[4] ; fit[5] += dfit[5] ; fit[6] += dfit[6] ;  /* angle/shift */
00607 
00608       if( verbose ){
00609          fprintf(stderr,
00610                  "Delta fit: %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n",
00611                  dfit[0], dfit[1], dfit[2], dfit[3], dfit[4], dfit[5], dfit[6] ) ;
00612          fprintf(stderr,
00613                  "Total fit: %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n",
00614                  dfit[0], fit[1], fit[2], fit[3], fit[4], fit[5], fit[6] ) ;
00615       }
00616 
00617       good = (++iter < max_iter) &&
00618              ( fabs(dfit[4]) > dxt        || fabs(dfit[5]) > dyt        ||
00619                fabs(dfit[6]) > dzt        || fabs(dfit[1]) > phi_thresh ||
00620                fabs(dfit[2]) > phi_thresh || fabs(dfit[3]) > phi_thresh   ) ;
00621 
00622       free(dfit) ; dfit = NULL ;
00623    } /* end while */
00624 
00625    if( verbose ) fprintf(stderr,"Iteration complete at %d steps\n",iter) ;
00626 
00627    /*-- save final alignment parameters --*/
00628 
00629    if( th1 != NULL ) *th1 = fit[1]*DFAC ;  /* convert to radians */
00630    if( th2 != NULL ) *th2 = fit[2]*DFAC ;
00631    if( th3 != NULL ) *th3 = fit[3]*DFAC ;
00632    if( dx  != NULL ) *dx  = fit[4] ;
00633    if( dy  != NULL ) *dy  = fit[5] ;
00634    if( dz  != NULL ) *dz  = fit[6] ;
00635 
00636    /*-- do the actual realignment --*/
00637 
00638    if( ! noreg ){
00639       if( final_regmode < 0 ) final_regmode = regmode ;  /* 20 Nov 1998 */
00640       THD_rota_method( final_regmode ) ;
00641       tim = THD_rota3D( fim ,
00642                         ax1,fit[1]*DFAC , ax2,fit[2]*DFAC , ax3,fit[3]*DFAC ,
00643                         dcode , fit[4],fit[5],fit[6] ) ;
00644    } else {
00645       tim = NULL ;
00646    }
00647 
00648    if( tim != NULL && clipit &&
00649        (final_regmode == MRI_QUINTIC || final_regmode==MRI_CUBIC  ||
00650         final_regmode == MRI_HEPTIC  || final_regmode==MRI_FOURIER  ) ){
00651 
00652       register int ii ;
00653       register float ftop , fbot , * tar ;
00654 
00655       ftop = mri_max( fim ); fbot = mri_min( fim );
00656       tar  = MRI_FLOAT_PTR(tim) ;
00657       for( ii=0 ; ii < tim->nvox ; ii++ ){
00658               if( tar[ii] < fbot ) tar[ii] = fbot ;
00659          else if( tar[ii] > ftop ) tar[ii] = ftop ;
00660       }
00661    }
00662 
00663    if( fim != im ) mri_free(fim) ;  /* if it was a copy, junk it */
00664 
00665    RETURN( tim );  /* 10-4, good buddy */
00666 }

void mri_3dalign_params int    maxite,
float    dxy,
float    dph,
float    dfac,
int    bx1,
int    bx2,
int    bx3,
int    dc
 

Definition at line 67 of file mri_3dalign.c.

References ax1, ax2, ax3, dcode, delfac, DXY_THRESH, dxy_thresh, MAX_ITER, max_iter, PHI_THRESH, and phi_thresh.

Referenced by RT_registration_3D_setup(), and VOLREG_main().

00070 {
00071    if( maxite > 0   ) max_iter    = maxite ; else max_iter    = MAX_ITER    ;
00072    if( dxy    > 0.0 ) dxy_thresh  = dxy    ; else dxy_thresh  = DXY_THRESH  ;
00073    if( dph    > 0.0 ) phi_thresh  = dph    ; else phi_thresh  = PHI_THRESH  ;
00074    if( dfac   > 0.0 ) delfac      = dfac   ;
00075 
00076    if( bx1 >= 0 && bx1 <= 2 ) ax1 = bx1 ;
00077    if( bx2 >= 0 && bx2 <= 2 ) ax2 = bx2 ;
00078    if( bx3 >= 0 && bx3 <= 2 ) ax3 = bx3 ;
00079 
00080    dcode = dc ;
00081    return ;
00082 }

void mri_3dalign_scaleinit float    ttt
 

Definition at line 60 of file mri_3dalign.c.

References sinit.

00061 {
00062   if( ttt > 0.0 ) sinit = ttt ;
00063 }

MRI_3dalign_basis* mri_3dalign_setup MRI_IMAGE   imbase,
MRI_IMAGE   imwt
 

Definition at line 185 of file mri_3dalign.c.

References ADDTO_IMARR, ax1, ax2, ax3, MRI_3dalign_basis::chol_fitim, dcode, delfac, DFAC, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, EDIT_blur_volume_3d(), ENTRY, MRI_3dalign_basis::fitim, force_edging, imbase, IMTRIM, INIT_IMARR, malloc, mri_3dalign_edging_default(), MRI_5blur_inplace_3D(), MRI_autobbox(), MRI_FLOAT_PTR, mri_free(), MRI_IS_3D, mri_max(), mri_new_conforming, mri_startup_lsqfit(), mri_to_float(), MRI_IMAGE::nvox, MRI_IMAGE::nx, MRI_IMAGE::ny, nz, MRI_IMAGE::nz, MRI_IMAGE::pixel_size, regmode, RETURN, sinit, THD_rota3D(), THD_rota_method(), TRIM, VRANG, MRI_3dalign_basis::xa, MRI_3dalign_basis::xb, xedge, xfade, MRI_3dalign_basis::ya, MRI_3dalign_basis::yb, yedge, yfade, MRI_3dalign_basis::za, MRI_3dalign_basis::zb, zedge, and zfade.

Referenced by mri_3dalign_many(), RT_registration_3D_setup(), and VOLREG_main().

00186 {
00187    MRI_IMAGE *bim , *pim , *mim , *dim , *imww , *cim ;
00188    float *dar , *par , *mar ;
00189    float delta , dx,dy,dz ;
00190    int ii ;
00191    MRI_IMARR * fitim  =NULL;
00192    double * chol_fitim=NULL ;
00193    MRI_3dalign_basis *basis = NULL ;
00194 
00195 ENTRY("mri_3dalign_setup") ;
00196 
00197    if( !MRI_IS_3D(imbase) ){
00198      fprintf(stderr,"\n*** mri_3dalign_setup: cannot use nD images!\a\n") ;
00199      RETURN( NULL );
00200    }
00201 
00202    /*--- create output struct ---*/
00203 
00204    basis = (MRI_3dalign_basis *) malloc( sizeof(MRI_3dalign_basis) ) ;
00205 
00206    /*-- local copy of input image --*/
00207 
00208    cim = mri_to_float( imbase ) ;
00209 
00210    dx = fabs(cim->dx) ; if( dx == 0.0 ) dx = 1.0 ;
00211    dy = fabs(cim->dy) ; if( dy == 0.0 ) dy = 1.0 ;
00212    dz = fabs(cim->dz) ; if( dz == 0.0 ) dz = 1.0 ;
00213 
00214    /*--- get the weighting image ---*/
00215 
00216    if( imwt != NULL &&
00217        (imwt->nx != cim->nx || imwt->ny != cim->ny || imwt->nz != cim->nz) ){
00218 
00219       fprintf(stderr,"*** WARNING: in mri_3dalign_setup, weight image mismatch!\n") ;
00220       imwt = NULL ;
00221    }
00222 
00223    /* make weight up from the base if it isn't supplied */
00224 
00225    if( imwt == NULL ){
00226       int nx=cim->nx , ny=cim->ny , nz=cim->nz , nxy = nx*ny , nxyz=nxy*nz ;
00227       int ii ;
00228       float * f , clip ;
00229 
00230       /* copy base image */
00231 
00232       imww = mri_to_float( cim ) ; f = MRI_FLOAT_PTR(imww) ;
00233 
00234       if( verbose ) fprintf(stderr,"  initializing weight") ;
00235 
00236       for( ii=0 ; ii < nxyz ; ii++ ) f[ii] = fabs(f[ii]) ;  /* 16 Nov 1998 */
00237 
00238 #if 1
00239       EDIT_blur_volume_3d( nx,ny,nz , dx,dy,dz ,
00240                            MRI_float , f , 3.0*dx , 3.0*dy , 3.0*dz ) ;
00241 #else
00242       MRI_5blur_inplace_3D( imww ) ;  /* 07 Jun 2002 */
00243 #endif
00244 
00245       if( verbose ) fprintf(stderr,":") ;
00246 
00247       clip  = 0.025 * mri_max(imww) ;
00248       for( ii=0 ; ii < nxyz ; ii++ ) if( f[ii] < clip ) f[ii] = 0.0 ;
00249 
00250    } else {
00251       imww = mri_to_float( imwt ) ;  /* just copy input weight image */
00252 
00253       if( wproc ){  /* 06 Jun 2002: process input weight */
00254         int nx=cim->nx , ny=cim->ny , nz=cim->nz , nxy = nx*ny , nxyz=nxy*nz ;
00255         int ii ;
00256         float * f , clip ;
00257 
00258         if( verbose ) fprintf(stderr,"  processing weight") ;
00259         f = MRI_FLOAT_PTR(imww) ;
00260         for( ii=0 ; ii < nxyz ; ii++ ) f[ii] = fabs(f[ii]) ;  /* 16 Nov 1998 */
00261 #if 1
00262         EDIT_blur_volume_3d( nx,ny,nz , dx,dy,dz ,
00263                              MRI_float , f , 3.0*dx , 3.0*dy , 3.0*dz ) ;
00264 #else
00265         MRI_5blur_inplace_3D( imww ) ;  /* 07 Jun 2002 */
00266 #endif
00267         if( verbose ) fprintf(stderr,":") ;
00268         clip  = 0.025 * mri_max(imww) ;
00269         for( ii=0 ; ii < nxyz ; ii++ ) if( f[ii] < clip ) f[ii] = 0.0 ;
00270       }
00271    }
00272 
00273    /*-- 10 Dec 2000: user-controlled fade out around the edges --*/
00274 
00275    if( imwt == NULL || force_edging ){
00276      int ff , ii,jj,kk ;
00277      int nx=cim->nx , ny=cim->ny , nz=cim->nz , nxy = nx*ny ;
00278      float *f = MRI_FLOAT_PTR(imww) ;
00279 
00280      xfade = xedge ; yfade = yedge ; zfade = zedge ;  /* static variables */
00281 
00282      if( xfade < 0 || yfade < 0 || zfade < 0 )
00283         mri_3dalign_edging_default(nx,ny,nz) ;        /* reassign fades */
00284 
00285 #define FF(i,j,k) f[(i)+(j)*nx+(k)*nxy]
00286 
00287       for( jj=0 ; jj < ny ; jj++ )
00288          for( ii=0 ; ii < nx ; ii++ )
00289             for( ff=0 ; ff < zfade ; ff++ )
00290                FF(ii,jj,ff) = FF(ii,jj,nz-1-ff) = 0.0 ;
00291 
00292       for( kk=0 ; kk < nz ; kk++ )
00293          for( jj=0 ; jj < ny ; jj++ )
00294             for( ff=0 ; ff < xfade ; ff++ )
00295                FF(ff,jj,kk) = FF(nx-1-ff,jj,kk) = 0.0 ;
00296 
00297       for( kk=0 ; kk < nz ; kk++ )
00298          for( ii=0 ; ii < nx ; ii++ )
00299             for( ff=0 ; ff < yfade ; ff++ )
00300                FF(ii,ff,kk) = FF(ii,ny-1-ff,kk) = 0.0 ;
00301    }
00302 
00303    /*-- 06 Jun 2002: compute wtrimmed volume size --*/
00304 
00305    basis->xa = -1 ;  /* flag for no wtrim */
00306 
00307    if( wtrim ){
00308      int xa=-1,xb , ya,yb , za,zb ;
00309      MRI_autobbox( imww , &xa,&xb , &ya,&yb , &za,&zb ) ;
00310      if( xa >= 0 ){
00311        float nxyz = imww->nx * imww->ny * imww->nz ;
00312        float nttt = (xb-xa+1)*(yb-ya+1)*(zb-za+1) ;
00313        float trat = 100.0 * nttt / nxyz ;
00314 
00315        if( verbose )
00316          fprintf(stderr,"  wtrim: [%d..%d]x[%d..%d]x[%d..%d]"
00317                         " = %d voxels kept, out of %d (%.1f%%)\n" ,
00318                  xa,xb , ya,yb , za,zb , (int)nttt , (int)nxyz , trat ) ;
00319 
00320        /* keep trimming if saves at least 10% per volume */
00321 
00322        if( trat < 90.0 ){
00323          basis->xa = xa ; basis->xb = xb ;
00324          basis->ya = ya ; basis->yb = yb ;
00325          basis->za = za ; basis->zb = zb ;
00326 
00327          TRIM(imww) ;
00328        } else if( verbose ){
00329          fprintf(stderr,"  skipping use of trim - too little savings\n");
00330        }
00331      }
00332    }
00333 
00334    VRANG("weight",imww) ;
00335    if( verbose ){
00336      float *f=MRI_FLOAT_PTR(imww) , perc ;
00337      int ii , nxyz = imww->nvox , nzer=0 ;
00338      for( ii=0 ; ii < nxyz ; ii++ ) nzer += (f[ii] == 0.0) ;
00339      perc = (100.0*nzer)/nxyz ;
00340      fprintf(stderr,"  # zero weights=%d out of %d (%.1f%%)\n",nzer,nxyz,perc);
00341    }
00342 
00343    /*-- base image --*/
00344 
00345    INIT_IMARR( fitim ) ;             /* array of fitting images */
00346 
00347    if( DOTRIM ) bim = IMTRIM(cim) ;  /* a trimmed duplicate */
00348    else         bim = cim ;          /* base image */
00349    ADDTO_IMARR( fitim , bim ) ;
00350 
00351    THD_rota_method( regmode ) ;
00352 
00353 #ifndef MEGA
00354 #define MEGA (1024*1024)
00355 #endif
00356    if( verbose ) fprintf(stderr ,
00357                          "  mri_3dalign: using %d Mbytes of workspace\n" ,
00358                          10 * bim->nvox * bim->pixel_size / MEGA ) ;
00359 
00360    /*-- d/d(th1) image [angles in degrees here] --*/
00361 
00362    if( verbose ) fprintf(stderr,"  initializing d/d(th1)") ;
00363 
00364    delta = 2.0*delfac/( cim->nx + cim->ny + cim->nz ) ;
00365    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00366 
00367    pim = THD_rota3D( cim , ax1,delta , ax2,0.0 , ax3,0.0 ,
00368                      dcode , 0.0 , 0.0 , 0.0 ) ;
00369    if( verbose ) fprintf(stderr,":") ;
00370 
00371    mim = THD_rota3D( cim , ax1,-delta , ax2,0.0 , ax3,0.0 ,
00372                      dcode , 0.0 , 0.0 , 0.0 ) ;
00373    if( verbose ) fprintf(stderr,":") ;
00374 
00375    dim   = mri_new_conforming( cim , MRI_float ) ;
00376    delta = sinit * 0.5 * DFAC / delta ;
00377    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00378    for( ii=0 ; ii < dim->nvox ; ii++ )
00379       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00380    mri_free(pim) ; mri_free(mim) ;
00381    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00382    VRANG("d/d(th1)",dim) ;
00383 
00384    /*-- d/d(th2) image --*/
00385 
00386    if( verbose ) fprintf(stderr,"  initializing d/d(th2)") ;
00387 
00388    delta = 2.0*delfac/( cim->nx + cim->ny + cim->nz ) ;
00389    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00390 
00391    pim = THD_rota3D( cim , ax1,0.0 , ax2,delta , ax3,0.0 ,
00392                      dcode , 0.0 , 0.0 , 0.0 ) ;
00393    if( verbose ) fprintf(stderr,":") ;
00394 
00395    mim = THD_rota3D( cim , ax1,0.0 , ax2,-delta , ax3,0.0 ,
00396                      dcode , 0.0 , 0.0 , 0.0 ) ;
00397    if( verbose ) fprintf(stderr,":") ;
00398 
00399    dim   = mri_new_conforming( cim , MRI_float ) ;
00400    delta = sinit * 0.5 * DFAC / delta ;
00401    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00402    for( ii=0 ; ii < dim->nvox ; ii++ )
00403       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00404    mri_free(pim) ; mri_free(mim) ;
00405    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00406    VRANG("d/d(th2)",dim) ;
00407 
00408    /*-- d/d(th3) image --*/
00409 
00410    if( verbose ) fprintf(stderr,"  initializing d/d(th3)") ;
00411 
00412    delta = 2.0*delfac/( cim->nx + cim->ny + cim->nz ) ;
00413    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00414 
00415    pim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,delta ,
00416                      dcode , 0.0 , 0.0 , 0.0 ) ;
00417    if( verbose ) fprintf(stderr,":") ;
00418 
00419    mim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,-delta ,
00420                      dcode , 0.0 , 0.0 , 0.0 ) ;
00421    if( verbose ) fprintf(stderr,":") ;
00422 
00423    dim   = mri_new_conforming( cim , MRI_float ) ;
00424    delta = sinit * 0.5 * DFAC / delta ;
00425    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00426    for( ii=0 ; ii < dim->nvox ; ii++ )
00427       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00428    mri_free(pim) ; mri_free(mim) ;
00429    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00430    VRANG("d/d(th3)",dim) ;
00431 
00432    /*-- d/dx image --*/
00433 
00434    if( verbose ) fprintf(stderr,"  initializing d/dx") ;
00435 
00436    delta = delfac * dx ;
00437    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00438 
00439    pim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00440                      dcode , delta , 0.0 , 0.0 ) ;
00441    if( verbose ) fprintf(stderr,":") ;
00442 
00443    mim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00444                      dcode , -delta , 0.0 , 0.0 ) ;
00445    if( verbose ) fprintf(stderr,":") ;
00446 
00447    dim   = mri_new_conforming( cim , MRI_float ) ;
00448    delta = sinit * 0.5 / delta ;
00449    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00450    for( ii=0 ; ii < dim->nvox ; ii++ )
00451       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00452    mri_free(pim) ; mri_free(mim) ;
00453    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00454    VRANG("d/dx",dim) ;
00455 
00456    /*-- d/dy image --*/
00457 
00458    if( verbose ) fprintf(stderr,"  initializing d/dy") ;
00459 
00460    delta = delfac * dy ;
00461    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00462 
00463    pim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00464                      dcode , 0.0 , delta , 0.0 ) ;
00465    if( verbose ) fprintf(stderr,":") ;
00466 
00467    mim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00468                      dcode , 0.0 , -delta , 0.0 ) ;
00469    if( verbose ) fprintf(stderr,":") ;
00470 
00471    dim   = mri_new_conforming( cim , MRI_float ) ;
00472    delta = sinit * 0.5 / delta ;
00473    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00474    for( ii=0 ; ii < dim->nvox ; ii++ )
00475       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00476    mri_free(pim) ; mri_free(mim) ;
00477    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00478    VRANG("d/dy",dim) ;
00479 
00480    /*-- d/dz image --*/
00481 
00482    if( verbose ) fprintf(stderr,"  initializing d/dz") ;
00483 
00484    delta = delfac * dz ;
00485    if( verbose ) fprintf(stderr,"[delta=%g]",delta) ;
00486 
00487    pim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00488                      dcode , 0.0 , 0.0 , delta ) ;
00489    if( verbose ) fprintf(stderr,":") ;
00490 
00491    mim = THD_rota3D( cim , ax1,0.0 , ax2,0.0 , ax3,0.0 ,
00492                      dcode , 0.0 , 0.0 , -delta ) ;
00493    if( verbose ) fprintf(stderr,":") ;
00494 
00495    dim   = mri_new_conforming( cim , MRI_float ) ;
00496    delta = sinit * 0.5 / delta ;
00497    dar   = MRI_FLOAT_PTR(dim) ; par = MRI_FLOAT_PTR(pim) ; mar = MRI_FLOAT_PTR(mim) ;
00498    for( ii=0 ; ii < dim->nvox ; ii++ )
00499       dar[ii] = delta * ( mar[ii] - par[ii] ) ;
00500    mri_free(pim) ; mri_free(mim) ;
00501    TRIM( dim ) ; ADDTO_IMARR( fitim , dim ) ;
00502    VRANG("d/dz",dim) ;
00503 
00504    /*-- done with input copy, unless it is same as base for lsqfit --*/
00505 
00506    if( cim != bim ) mri_free(cim) ;
00507 
00508    /*-- initialize linear least squares --*/
00509 
00510    if( verbose ) fprintf(stderr,"  initializing least squares\n") ;
00511 
00512    chol_fitim = mri_startup_lsqfit( fitim , imww ) ;
00513 
00514    mri_free(imww) ;
00515 
00516    /*-- save stuff --*/
00517 
00518    basis->fitim      = fitim ;
00519    basis->chol_fitim = chol_fitim ;
00520 
00521    RETURN( basis );
00522 }

void mri_3dalign_wproccing int    ttt
 

Definition at line 58 of file mri_3dalign.c.

References wproc.

00058 { wproc = ttt; } /* 06 Jun 2002 */

void mri_3dalign_wtrimming int    ttt
 

Definition at line 56 of file mri_3dalign.c.

References wtrim.

Referenced by main(), and VL_command_line().

00056 { wtrim = ttt; } /* 06 Jun 2002 */

Variable Documentation

int ax1 = 0 [static]
 

Definition at line 25 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), mri_3dalign_params(), and mri_3dalign_setup().

int ax2 = 1 [static]
 

Definition at line 25 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), mri_3dalign_params(), and mri_3dalign_setup().

int ax3 = 2 [static]
 

Definition at line 25 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), mri_3dalign_params(), and mri_3dalign_setup().

float blurit = 0.0 [static]
 

Definition at line 120 of file mri_3dalign.c.

Referenced by mri_3dalign_blurring().

int clipit = 0 [static]
 

Definition at line 107 of file mri_3dalign.c.

Referenced by mri_3dalign_method(), and mri_3dalign_one().

int dcode = -1 [static]
 

Definition at line 26 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), mri_3dalign_params(), and mri_3dalign_setup().

float delfac = 1.5 [static]
 

Definition at line 22 of file mri_3dalign.c.

Referenced by mri_3dalign_params(), and mri_3dalign_setup().

float dxy_thresh = DXY_THRESH [static]
 

Definition at line 20 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_params().

int final_regmode = -1 [static]
 

Definition at line 123 of file mri_3dalign.c.

Referenced by mri_3dalign_final_regmode(), and mri_3dalign_one().

int force_edging = 0 [static]
 

Definition at line 135 of file mri_3dalign.c.

Referenced by mri_3dalign_force_edging(), and mri_3dalign_setup().

float init_dth1 = 0.0 [static]
 

Definition at line 86 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

float init_dth2 = 0.0 [static]
 

Definition at line 86 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

float init_dth3 = 0.0 [static]
 

Definition at line 86 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

float init_dx = 0.0 [static]
 

Definition at line 87 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

float init_dy = 0.0 [static]
 

Definition at line 87 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

float init_dz = 0.0 [static]
 

Definition at line 87 of file mri_3dalign.c.

Referenced by mri_3dalign_initvals(), and mri_3dalign_one().

int max_iter = MAX_ITER [static]
 

Definition at line 24 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_params().

int noreg = 0 [static]
 

Definition at line 106 of file mri_3dalign.c.

Referenced by mri_3dalign_method(), and mri_3dalign_one().

float phi_thresh = PHI_THRESH [static]
 

Definition at line 21 of file mri_3dalign.c.

Referenced by mri_3dalign_one(), and mri_3dalign_params().

int regmode = MRI_QUINTIC [static]
 

Definition at line 104 of file mri_3dalign.c.

Referenced by mri_3dalign_method(), mri_3dalign_one(), and mri_3dalign_setup().

float sinit = 1.0 [static]
 

Definition at line 31 of file mri_3dalign.c.

Referenced by mri_3dalign_scaleinit(), and mri_3dalign_setup().

int verbose = 0 [static]
 

Definition at line 105 of file mri_3dalign.c.

Referenced by mri_3dalign_method().

int wproc = 0 [static]
 

Definition at line 28 of file mri_3dalign.c.

Referenced by mri_3dalign_wproccing().

int wtrim = 0 [static]
 

Definition at line 29 of file mri_3dalign.c.

Referenced by mri_3dalign_wtrimming().

int xedge = -1 [static]
 

Definition at line 132 of file mri_3dalign.c.

Referenced by mri_3dalign_edging(), and mri_3dalign_setup().

int xfade [static]
 

Definition at line 133 of file mri_3dalign.c.

Referenced by mri_3dalign_edging_default(), and mri_3dalign_setup().

int yedge = -1 [static]
 

Definition at line 132 of file mri_3dalign.c.

Referenced by mri_3dalign_edging(), and mri_3dalign_setup().

int yfade [static]
 

Definition at line 133 of file mri_3dalign.c.

Referenced by mri_3dalign_edging_default(), and mri_3dalign_setup().

int zedge = -1 [static]
 

Definition at line 132 of file mri_3dalign.c.

Referenced by mri_3dalign_edging(), and mri_3dalign_setup().

int zfade [static]
 

Definition at line 133 of file mri_3dalign.c.

Referenced by mri_3dalign_edging_default(), and mri_3dalign_setup().

 

Powered by Plone

This site conforms to the following standards: