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_get_cmass.c

Go to the documentation of this file.
00001 #include "mrilib.h"
00002 
00003 /** not 7D SAFE **/
00004 
00005 /*--------------------------------------------------------------------
00006   12 Nov 2001:
00007   Get the center of mass of a 2D image;
00008   store it in the user-supplied locations *xcm, *ycm.
00009 ----------------------------------------------------------------------*/
00010 
00011 void mri_get_cmass_2D( MRI_IMAGE *im , float *xcm , float *ycm )
00012 {
00013    int ii,jj,joff , nx,ny ;
00014    float xx , yy , sum , val , *far ;
00015    MRI_IMAGE *flim ;
00016 
00017 ENTRY("mri_get_cmass_2D") ;
00018 
00019    if( im == NULL || xcm == NULL || ycm == NULL ) EXRETURN ;
00020 
00021    if( im->kind != MRI_float ) flim = mri_to_float( im ) ;
00022    else                        flim = im ;
00023 
00024    far = MRI_FLOAT_PTR(flim) ;
00025    nx  = im->nx ; ny = im->ny ;
00026 
00027    sum = xx = yy = 0.0 ;
00028    for( jj=0 ; jj < ny ; jj++ ){
00029       joff = jj * nx ;
00030       for( ii=0 ; ii < nx ; ii++ ){
00031          val = fabs(far[ii+joff]) ;
00032          sum += val ;
00033          xx  += val * ii ;
00034          yy  += val * jj ;
00035       }
00036    }
00037 
00038    if( sum > 0.0 ){ xx /= sum ; yy /= sum ; }
00039 
00040    if( flim != im ) mri_free(flim) ;
00041 
00042    *xcm = xx ; *ycm = yy ; EXRETURN ;
00043 }
00044 
00045 /*--------------------------------------------------------------------*/
00046 
00047 void mri_get_cmass_3D( MRI_IMAGE *im, float *xcm, float *ycm, float *zcm )
00048 {
00049    int ii,jj,kk,koff,joff , nx,ny,nz,nxy ;
00050    float xx,yy,zz , sum , val , *far ;
00051    MRI_IMAGE *flim ;
00052 
00053 ENTRY("mri_get_cmass_3D") ;
00054 
00055    if( im == NULL || xcm == NULL || ycm == NULL || zcm == NULL ) EXRETURN ;
00056 
00057    if( im->kind != MRI_float ) flim = mri_to_float( im ) ;
00058    else                        flim = im ;
00059 
00060    far = MRI_FLOAT_PTR(flim) ;
00061    nx  = im->nx ; ny = im->ny ; nz = im->nz ; nxy = nx*ny ;
00062 
00063    sum = xx = yy = zz = 0.0 ;
00064    for( kk=0 ; kk < nz ; kk++ ){
00065      koff = kk * nxy ;
00066      for( jj=0 ; jj < ny ; jj++ ){
00067        joff = koff + jj * nx ;
00068        for( ii=0 ; ii < nx ; ii++ ){
00069          val = fabs(far[ii+joff]) ;
00070          sum += val ;
00071          xx  += val * ii ;
00072          yy  += val * jj ;
00073          zz  += val * kk ;
00074        }
00075      }
00076    }
00077 
00078    if( sum > 0.0 ){ xx /= sum ; yy /= sum ; zz /= sum ; }
00079    else           { xx = 0.5*(nx-1); yy=0.5*(ny-1); zz=0.5*(nz-1); }
00080 
00081    if( flim != im ) mri_free(flim) ;
00082 
00083    *xcm = xx ; *ycm = yy ; *zcm = zz ; EXRETURN ;
00084 }
 

Powered by Plone

This site conforms to the following standards: