Doxygen Source Code Documentation
edt_clust2.c File Reference
#include "mrilib.h"Go to the source code of this file.
Functions | |
| MCW_cluster_array * | NIH_find_clusters (int nx, int ny, int nz, float dx, float dy, float dz, int ftype, void *fim, float max_dist, int mode) |
Function Documentation
|
||||||||||||||||||||||||||||||||||||||||||||
|
Modified MCW_find_clusters():
Definition at line 12 of file edt_clust2.c. References ADDTO_CLARR, ADDTO_CLUSTER, DESTROY_CLARR, ENTRY, fim, MCW_cluster::i, IJK_TO_THREE, INIT_CLARR, INIT_CLUSTER, ISOMERGE_MODE, ISOVALUE_MODE, MCW_cluster::j, MCW_cluster::k, KILL_CLUSTER, MCW_build_mask(), MCW_find_clusters(), MCW_cluster_array::num_clu, MCW_cluster::num_pt, nz, RETURN, and THREE_TO_IJK. Referenced by main().
00017 {
00018 MCW_cluster_array *clust_arr ;
00019 MCW_cluster *clust , *mask=NULL ;
00020 int ii,jj,kk , nxy,nxyz , ijk , ijk_last , mnum ;
00021 int icl , jma , ijkcl , ijkma , did_one ;
00022 float fimv ;
00023 short *sfar ;
00024 float *ffar ;
00025 byte *bfar ;
00026 short ic, jc, kc;
00027 short im, jm, km;
00028
00029 ENTRY("NIH_find_clusters") ;
00030
00031 if( fim == NULL ) RETURN(NULL) ;
00032
00033 switch( ftype ){
00034 default: RETURN(NULL) ;
00035 case MRI_short: sfar = (short *) fim ; break ;
00036 case MRI_byte : bfar = (byte *) fim ; break ;
00037 case MRI_float: ffar = (float *) fim ; break ;
00038 }
00039
00040 /* default => use older code (in edt_clust.c) */
00041
00042 if( mode <= 0 || mode > ISOMERGE_MODE ){
00043 RETURN( MCW_find_clusters( nx,ny,nz , dx,dy,dz ,
00044 ftype,fim , max_dist ) ) ;
00045 }
00046
00047 /*--- make a cluster that is a mask of points closer than max_dist ---*/
00048
00049 if( mode == ISOVALUE_MODE ){
00050 mask = MCW_build_mask (nx, ny, nz, dx, dy, dz, max_dist);
00051 if (mask == NULL)
00052 {
00053 fprintf(stderr, "Unable to build mask in NIH_find_clusters");
00054 RETURN(NULL);
00055 }
00056 mnum = mask->num_pt ;
00057 }
00058
00059 nxy = nx*ny ; nxyz = nxy * nz ;
00060
00061 /*--- scan through array, find nonzero point, build a cluster, ... ---*/
00062
00063 INIT_CLARR(clust_arr) ;
00064
00065 ijk_last = 0 ;
00066 do {
00067
00068 /* find nonzero point in 3D array, starting at ijk_last */
00069
00070 switch( ftype ){
00071 case MRI_short:
00072 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( sfar[ijk] != 0 ) break ;
00073 if( ijk < nxyz ){
00074 fimv = sfar[ijk] ; sfar[ijk] = 0 ; /* save found point */
00075 }
00076 break ;
00077
00078 case MRI_byte:
00079 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( bfar[ijk] != 0 ) break ;
00080 if( ijk < nxyz ){
00081 fimv = bfar[ijk] ; bfar[ijk] = 0 ; /* save found point */
00082 }
00083 break ;
00084
00085 case MRI_float:
00086 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( ffar[ijk] != 0.0 ) break ;
00087 if( ijk < nxyz ){
00088 fimv = ffar[ijk] ; ffar[ijk] = 0.0 ; /* save found point */
00089 }
00090 break ;
00091 }
00092 if( ijk == nxyz ) break ; /* didn't find any nonzero point! */
00093
00094 ijk_last = ijk+1 ; /* start here next time */
00095
00096 INIT_CLUSTER(clust) ; /* make a new cluster */
00097 IJK_TO_THREE(ijk,ic,jc,kc,nx,nxy) ; /* find 3D index */
00098 ADDTO_CLUSTER( clust , ic, jc, kc, fimv ) ; /* start cluster off */
00099
00100 switch( mode ){
00101
00102 case ISOVALUE_MODE:{ /* for each point in cluster:
00103 check points offset by mask for nonzero entries in fim
00104 enter those into cluster
00105 continue until end of cluster is reached
00106 (note that cluster is expanding as we progress) */
00107
00108 switch( ftype ){
00109 case MRI_short:
00110 for( icl=0 ; icl < clust->num_pt ; icl++ ){
00111 ic = clust->i[icl]; /* check around this point */
00112 jc = clust->j[icl];
00113 kc = clust->k[icl];
00114
00115 for( jma=0 ; jma < mnum ; jma++ ){
00116 im = ic + mask->i[jma]; /* offset by mask */
00117 jm = jc + mask->j[jma];
00118 km = kc + mask->k[jma];
00119 if( im < 0 || im >= nx ||
00120 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ;
00121
00122 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy);
00123 if( ijkma < ijk_last || ijkma >= nxyz || sfar[ijkma] != fimv ) continue ;
00124
00125 ADDTO_CLUSTER( clust , im, jm, km, sfar[ijkma] ) ;
00126 sfar[ijkma] = 0 ;
00127 }
00128 }
00129 break ;
00130
00131 case MRI_byte:
00132 for( icl=0 ; icl < clust->num_pt ; icl++ ){
00133 ic = clust->i[icl];
00134 jc = clust->j[icl];
00135 kc = clust->k[icl];
00136
00137 for( jma=0 ; jma < mnum ; jma++ ){
00138 im = ic + mask->i[jma];
00139 jm = jc + mask->j[jma];
00140 km = kc + mask->k[jma];
00141 if( im < 0 || im >= nx ||
00142 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ;
00143
00144 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy);
00145 if( ijkma < ijk_last || ijkma >= nxyz || bfar[ijkma] != fimv ) continue ;
00146
00147 ADDTO_CLUSTER( clust , im, jm, km, bfar[ijkma] ) ;
00148 bfar[ijkma] = 0 ;
00149 }
00150 }
00151 break ;
00152
00153 case MRI_float:
00154 for( icl=0 ; icl < clust->num_pt ; icl++ ){
00155 ic = clust->i[icl];
00156 jc = clust->j[icl];
00157 kc = clust->k[icl];
00158
00159 for( jma=0 ; jma < mnum ; jma++ ){
00160 im = ic + mask->i[jma];
00161 jm = jc + mask->j[jma];
00162 km = kc + mask->k[jma];
00163 if( im < 0 || im >= nx ||
00164 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ;
00165
00166 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy);
00167 if( ijkma < ijk_last || ijkma >= nxyz || ffar[ijkma] != fimv ) continue ;
00168
00169 ADDTO_CLUSTER( clust , im, jm, km, ffar[ijkma] ) ;
00170 ffar[ijkma] = 0.0 ;
00171 }
00172 }
00173 break ;
00174 } /* end of switch on array type */
00175 }
00176 break ; /* end of ISOVALUE_MODE */
00177
00178 /*.................................*/
00179
00180 case ISOMERGE_MODE:{ /* find other points with the same value */
00181
00182 switch( ftype ){
00183 case MRI_short:
00184 for( ijk=ijk_last ; ijk < nxyz ; ijk++ )
00185 if( sfar[ijk] == fimv ){
00186 IJK_TO_THREE(ijk,ic,jc,kc,nx,nxy) ; /* find 3D index */
00187 ADDTO_CLUSTER( clust , ic, jc, kc, fimv ) ; /* start cluster off */
00188 sfar[ijk] = 0 ;
00189 }
00190 break ;
00191
00192 case MRI_byte:
00193 for( ijk=ijk_last ; ijk < nxyz ; ijk++ )
00194 if( bfar[ijk] == fimv ){
00195 IJK_TO_THREE(ijk,ic,jc,kc,nx,nxy) ; /* find 3D index */
00196 ADDTO_CLUSTER( clust , ic, jc, kc, fimv ) ; /* start cluster off */
00197 bfar[ijk] = 0 ;
00198 }
00199 break ;
00200
00201 case MRI_float:
00202 for( ijk=ijk_last ; ijk < nxyz ; ijk++ )
00203 if( ffar[ijk] == fimv ){
00204 IJK_TO_THREE(ijk,ic,jc,kc,nx,nxy) ; /* find 3D index */
00205 ADDTO_CLUSTER( clust , ic, jc, kc, fimv ) ; /* start cluster off */
00206 ffar[ijk] = 0 ;
00207 }
00208 break ;
00209 }
00210 }
00211 break ; /* end of ISOMERGE_MODE */
00212
00213 }
00214
00215 ADDTO_CLARR(clust_arr,clust) ;
00216 } while( 1 ) ;
00217
00218 if( mask != NULL ) KILL_CLUSTER(mask) ;
00219
00220 if( clust_arr->num_clu <= 0 ){ DESTROY_CLARR(clust_arr) ; }
00221
00222 RETURN(clust_arr) ;
00223 }
|