#include "mrilib.h"
static char *report = NULL ;
char * mri_clusterize_report(void){ return report; }
/*---------------------------------------------------------------------*/
/*! Cluster-edit volume bim, possibly thresholding with tim, and
produce a new output image. [05 Sep 2006]
-----------------------------------------------------------------------*/
MRI_IMAGE * mri_clusterize( float rmm , float vmul , MRI_IMAGE *bim ,
float thr , MRI_IMAGE *tim )
{
float dx,dy,dz , dbot ;
int nx,ny,nz , ptmin,iclu , nkeep,nkill ;
MRI_IMAGE *cim ; void *car ;
MCW_cluster *cl ; MCW_cluster_array*clar ;
ENTRY("mri_clusterize") ;
if( report != NULL ){ free(report); report = NULL; }
if( bim == NULL || mri_data_pointer(bim) == NULL ) RETURN(NULL) ;
nx = bim->nx; ny = bim->ny; nz = bim->nz;
dx = bim->dx; dy = bim->dy; dz = bim->dz;
if( dx <= 0.0f ) dx = 1.0f ;
if( dy <= 0.0f ) dy = 1.0f ;
if( dz <= 0.0f ) dz = 1.0f ;
dbot = MIN(dx,dy) ; dbot = MIN(dbot,dz) ;
if( rmm < dbot ){ dx = dy = dz = 1.0f; rmm = 1.01f; }
if( vmul <= 2.0*dx*dy*dz ) RETURN(NULL) ;
/* create copy of input image (this will be edited below) */
cim = mri_copy(bim) ; car = mri_data_pointer(cim) ;
if( car == NULL ){ mri_free(cim) ; RETURN(NULL) ; }
/* threshold it, if so ordered (note that tim==bim is legal) */
if( thr > 0.0f && tim != NULL )
mri_threshold( -thr , thr , tim , cim ) ;
/* smallest cluster to keep */
ptmin = (int)( vmul/(dx*dy*dz) + 0.99f ) ;
/* find all clusters */
clar = MCW_find_clusters( nx,ny,nz , dx,dy,dz , cim->kind,car , rmm ) ;
/* put all big clusters back into the image */
if( clar != NULL ){
nkeep = nkill = 0 ;
for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){
cl = clar->clar[iclu] ;
if( cl->num_pt >= ptmin ){ /* put back into array */
MCW_cluster_to_vol( nx,ny,nz , cim->kind,car , cl ) ;
nkeep += cl->num_pt ;
} else {
nkill += cl->num_pt ;
}
}
DESTROY_CLARR(clar) ;
report = THD_zzprintf( report ,
"Voxels survived clustering = %5d\n"
"Voxels edited out = %5d\n"
"Cluster size threshold = %d" ,
nkeep , nkill , ptmin ) ;
}
RETURN(cim) ;
}
syntax highlighted by Code2HTML, v. 0.9.1