Doxygen Source Code Documentation
edt_clust.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Functions | |
MCW_cluster_array * | MCW_find_clusters (int nx, int ny, int nz, float dx, float dy, float dz, int ftype, void *fim, float max_dist) |
void | MCW_cluster_to_vol (int nx, int ny, int nz, int ftype, void *fim, MCW_cluster *clust) |
void | MCW_erode_clusters (int nx, int ny, int nz, float dx, float dy, float dz, int ftype, void *fim, float max_dist, float pv, int dilate) |
Function Documentation
|
Definition at line 200 of file edt_clust.c. References ENTRY, fim, MCW_cluster::i, MCW_cluster::j, MCW_cluster::k, MCW_cluster::mag, MCW_cluster::num_pt, nz, and THREE_TO_IJK. Referenced by EDIT_one_dataset(), main(), RCREND_reload_func_dset(), and REND_reload_func_dset().
00202 { 00203 int icl, ijk ; 00204 int nxy ; 00205 short * sfar ; 00206 float * ffar ; 00207 byte * bfar ; 00208 00209 ENTRY("MCW_cluster_to_vol") ; 00210 00211 if( fim == NULL || clust == NULL ) EXRETURN ; 00212 00213 nxy = nx * ny; 00214 00215 switch( ftype ){ 00216 case MRI_short: 00217 sfar = (short *) fim ; 00218 for( icl=0 ; icl < clust->num_pt ; icl++ ) 00219 { 00220 ijk = THREE_TO_IJK (clust->i[icl], clust->j[icl], clust->k[icl], 00221 nx, nxy); 00222 sfar[ijk] = clust->mag[icl] ; 00223 } 00224 EXRETURN ; 00225 00226 case MRI_byte: 00227 bfar = (byte *) fim ; 00228 for( icl=0 ; icl < clust->num_pt ; icl++ ) 00229 { 00230 ijk = THREE_TO_IJK (clust->i[icl], clust->j[icl], clust->k[icl], 00231 nx, nxy); 00232 bfar[ijk] = clust->mag[icl] ; 00233 } 00234 EXRETURN ; 00235 00236 case MRI_float: 00237 ffar = (float *) fim ; 00238 for( icl=0 ; icl < clust->num_pt ; icl++ ) 00239 { 00240 ijk = THREE_TO_IJK (clust->i[icl], clust->j[icl], clust->k[icl], 00241 nx, nxy); 00242 ffar[ijk] = clust->mag[icl] ; 00243 } 00244 EXRETURN ; 00245 } 00246 00247 EXRETURN ; /* should not be reached */ 00248 } |
|
Definition at line 271 of file edt_clust.c. References ENTRY, fim, free, MCW_cluster::i, IJK_TO_THREE, MCW_cluster::j, MCW_cluster::k, KILL_CLUSTER, malloc, MCW_build_mask(), MCW_cluster::num_pt, nz, and THREE_TO_IJK. Referenced by EDIT_one_dataset().
00282 { 00283 MCW_cluster * mask = NULL; /* mask determines nbhd membership */ 00284 int minimum; /* minimum number of voxels in nbhd */ 00285 int count; /* count of voxels in neighborhood */ 00286 int nxy, nxyz; /* numbers of voxels */ 00287 int ijk, iv, jv, kv; /* voxel indices */ 00288 int ijkm, im, jm, km; /* voxel indices */ 00289 int imask, nmask; /* mask indices */ 00290 short * sfar; /* pointer to short data */ 00291 byte * bfar; /* pointer to byte data */ 00292 float * ffar; /* pointer to float data */ 00293 float * efim = NULL; /* copy of eroded voxels */ 00294 00295 ENTRY("MCW_erode_clusters") ; 00296 00297 00298 /*----- Just in case -----*/ 00299 if ( fim == NULL ) EXRETURN; 00300 00301 00302 /*----- Initialize local variables -----*/ 00303 nxy = nx * ny; nxyz = nxy * nz; 00304 00305 00306 /*----- Set pointer to input data -----*/ 00307 switch (ftype) 00308 { 00309 default: EXRETURN; 00310 case MRI_short: sfar = (short *) fim; break; 00311 case MRI_byte : bfar = (byte *) fim; break; 00312 case MRI_float: ffar = (float *) fim; break; 00313 } 00314 00315 00316 /*----- Initialization for copy of eroded voxels -----*/ 00317 efim = (float *) malloc (sizeof(float) * nxyz); 00318 if (efim == NULL) 00319 { 00320 fprintf (stderr, "Unable to allocate memory in MCW_erode_clusters"); 00321 EXRETURN; 00322 } 00323 for (ijk = 0; ijk < nxyz; ijk++) 00324 efim[ijk] = 0.0; 00325 00326 00327 /*--- Make a cluster that is a mask of points closer than max_dist ---*/ 00328 mask = MCW_build_mask (nx, ny, nz, dx, dy, dz, max_dist); 00329 if (mask == NULL) 00330 { 00331 fprintf (stderr, "Unable to build mask in MCW_erode_clusters"); 00332 EXRETURN; 00333 } 00334 00335 00336 /*----- Calculate minimum number of voxels in nbhd. for non-erosion -----*/ 00337 nmask = mask->num_pt ; 00338 minimum = floor(pv*nmask + 0.99); 00339 if (minimum <= 0) EXRETURN; /*----- Nothing will be eroded -----*/ 00340 00341 00342 /*----- Step 1: Identify voxels to be eroded -----*/ 00343 switch (ftype) 00344 { 00345 case MRI_short: 00346 for (ijk = 0; ijk < nxyz; ijk++) 00347 { 00348 if (sfar[ijk] == 0) continue; 00349 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00350 00351 /*----- Count number of active voxels in the neighborhood -----*/ 00352 count = 0; 00353 for (imask = 0; imask < nmask; imask++) 00354 { 00355 im = iv + mask->i[imask]; 00356 jm = jv + mask->j[imask]; 00357 km = kv + mask->k[imask]; 00358 if ( im < 0 || jm < 0 || km < 0 || 00359 im >= nx || jm >= ny || km >= nz ) continue; 00360 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00361 if (sfar[ijkm] != 0) count++; 00362 } 00363 00364 /*----- Record voxel to be eroded -----*/ 00365 if (count < minimum) efim[ijk] = (float) sfar[ijk]; 00366 } 00367 break; 00368 00369 case MRI_byte: 00370 for (ijk = 0; ijk < nxyz; ijk++) 00371 { 00372 if (bfar[ijk] == 0) continue; 00373 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00374 00375 /*----- Count number of active voxels in the neighborhood -----*/ 00376 count = 0; 00377 for (imask = 0; imask < nmask; imask++) 00378 { 00379 im = iv + mask->i[imask]; 00380 jm = jv + mask->j[imask]; 00381 km = kv + mask->k[imask]; 00382 if ( im < 0 || jm < 0 || km < 0 || 00383 im >= nx || jm >= ny || km >= nz ) continue; 00384 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00385 if (bfar[ijkm] != 0) count++; 00386 } 00387 00388 /*----- Record voxel to be eroded -----*/ 00389 if (count < minimum) efim[ijk] = (float) bfar[ijk]; 00390 } 00391 break; 00392 00393 case MRI_float: 00394 for (ijk = 0; ijk < nxyz; ijk++) 00395 { 00396 if (ffar[ijk] == 0.0) continue; 00397 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00398 00399 /*----- Count number of active voxels in the neighborhood -----*/ 00400 count = 0; 00401 for (imask = 0; imask < nmask; imask++) 00402 { 00403 im = iv + mask->i[imask]; 00404 jm = jv + mask->j[imask]; 00405 km = kv + mask->k[imask]; 00406 if ( im < 0 || jm < 0 || km < 0 || 00407 im >= nx || jm >= ny || km >= nz ) continue; 00408 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00409 if (ffar[ijkm] != 0.0) count++; 00410 } 00411 00412 /*----- Record voxel to be eroded -----*/ 00413 if (count < minimum) efim[ijk] = ffar[ijk]; 00414 } 00415 break; 00416 00417 } 00418 00419 00420 /*----- Step 2: Erode voxels -----*/ 00421 switch (ftype) 00422 { 00423 case MRI_short: 00424 for (ijk = 0; ijk < nxyz; ijk++) 00425 if (efim[ijk] != 0.0) sfar[ijk] = 0; 00426 break; 00427 00428 case MRI_byte: 00429 for (ijk = 0; ijk < nxyz; ijk++) 00430 if (efim[ijk] != 0.0) bfar[ijk] = 0; 00431 break; 00432 00433 case MRI_float: 00434 for (ijk = 0; ijk < nxyz; ijk++) 00435 if (efim[ijk] != 0.0) ffar[ijk] = 0.0; 00436 break; 00437 } 00438 00439 00440 /*----- Proceed with dilation phase? -----*/ 00441 if (dilate) 00442 { 00443 00444 00445 /*----- Step 3: Identify voxels to be restored -----*/ 00446 switch (ftype) 00447 { 00448 case MRI_short: 00449 for (ijk = 0; ijk < nxyz; ijk++) 00450 { 00451 if (efim[ijk] == 0.0) continue; 00452 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00453 00454 /*---- Determine if any active voxels in the neighborhood ----*/ 00455 for (imask = 0; imask < nmask; imask++) 00456 { 00457 im = iv + mask->i[imask]; 00458 jm = jv + mask->j[imask]; 00459 km = kv + mask->k[imask]; 00460 if ( im < 0 || jm < 0 || km < 0 || 00461 im >= nx || jm >= ny || km >= nz ) continue; 00462 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00463 if (sfar[ijkm] != 0) break; 00464 } 00465 00466 /*----- Reset voxel not to be restored -----*/ 00467 if (imask == nmask) efim[ijk] = 0.0; 00468 } 00469 break; 00470 00471 case MRI_byte: 00472 for (ijk = 0; ijk < nxyz; ijk++) 00473 { 00474 if (efim[ijk] == 0.0) continue; 00475 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00476 00477 /*---- Determine if any active voxels in the neighborhood ----*/ 00478 for (imask = 0; imask < nmask; imask++) 00479 { 00480 im = iv + mask->i[imask]; 00481 jm = jv + mask->j[imask]; 00482 km = kv + mask->k[imask]; 00483 if ( im < 0 || jm < 0 || km < 0 || 00484 im >= nx || jm >= ny || km >= nz ) continue; 00485 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00486 if (bfar[ijkm] != 0) break; 00487 } 00488 00489 /*----- Reset voxel not to be restored -----*/ 00490 if (imask == nmask) efim[ijk] = 0.0; 00491 } 00492 break; 00493 00494 case MRI_float: 00495 for (ijk = 0; ijk < nxyz; ijk++) 00496 { 00497 if (efim[ijk] == 0.0) continue; 00498 IJK_TO_THREE (ijk, iv, jv, kv, nx, nxy); 00499 00500 /*---- Determine if any active voxels in the neighborhood ----*/ 00501 for (imask = 0; imask < nmask; imask++) 00502 { 00503 im = iv + mask->i[imask]; 00504 jm = jv + mask->j[imask]; 00505 km = kv + mask->k[imask]; 00506 if ( im < 0 || jm < 0 || km < 0 || 00507 im >= nx || jm >= ny || km >= nz ) continue; 00508 ijkm = THREE_TO_IJK (im, jm, km, nx, nxy); 00509 if (ffar[ijkm] != 0.0) break; 00510 } 00511 00512 /*----- Reset voxel not to be restored -----*/ 00513 if (imask == nmask) efim[ijk] = 0.0; 00514 } 00515 break; 00516 } 00517 00518 00519 /*----- Step 4: Restore voxels -----*/ 00520 switch (ftype) 00521 { 00522 case MRI_short: 00523 for (ijk = 0; ijk < nxyz; ijk++) 00524 if (efim[ijk] != 0.0) sfar[ijk] = (short) efim[ijk]; 00525 break; 00526 00527 case MRI_byte: 00528 for (ijk = 0; ijk < nxyz; ijk++) 00529 if (efim[ijk] != 0.0) bfar[ijk] = (byte) efim[ijk]; 00530 break; 00531 00532 case MRI_float: 00533 for (ijk = 0; ijk < nxyz; ijk++) 00534 if (efim[ijk] != 0.0) ffar[ijk] = efim[ijk]; 00535 break; 00536 } 00537 00538 } /* if (dilate) */ 00539 00540 00541 /*----- Release memory -----*/ 00542 KILL_CLUSTER(mask) ; 00543 free (efim); efim = NULL; 00544 EXRETURN ; 00545 } |
|
Definition at line 23 of file edt_clust.c. References ADDTO_CLARR, ADDTO_CLUSTER, DESTROY_CLARR, ENTRY, fim, MCW_cluster::i, IJK_TO_THREE, INIT_CLARR, INIT_CLUSTER, MCW_cluster::j, MCW_cluster::k, KILL_CLUSTER, MCW_build_mask(), MCW_cluster_array::num_clu, MCW_cluster::num_pt, nz, RETURN, and THREE_TO_IJK. Referenced by EDIT_one_dataset(), identify_clusters(), main(), NIH_find_clusters(), RCREND_reload_func_dset(), REND_reload_func_dset(), and ROIPLOT_main().
00028 { 00029 MCW_cluster_array * clust_arr ; 00030 MCW_cluster * clust , * mask ; 00031 int ii,jj,kk , nxy,nxyz , ijk , ijk_last , mnum ; 00032 int icl , jma , ijkcl , ijkma , did_one ; 00033 float fimv ; 00034 short * sfar ; 00035 float * ffar ; 00036 byte * bfar ; 00037 short ic, jc, kc; 00038 short im, jm, km; 00039 00040 ENTRY("MCW_find_clusters") ; 00041 00042 if( fim == NULL ) RETURN(NULL) ; 00043 00044 switch( ftype ){ 00045 default: RETURN(NULL) ; 00046 case MRI_short: sfar = (short *) fim ; break ; 00047 case MRI_byte : bfar = (byte *) fim ; break ; 00048 case MRI_float: ffar = (float *) fim ; break ; 00049 } 00050 00051 /*--- make a cluster that is a mask of points closer than max_dist ---*/ 00052 00053 mask = MCW_build_mask (nx, ny, nz, dx, dy, dz, max_dist); 00054 if (mask == NULL) 00055 { 00056 fprintf (stderr, "Unable to build mask in MCW_find_clusters"); 00057 RETURN(NULL) ; 00058 } 00059 00060 nxy = nx*ny ; nxyz = nxy * nz ; 00061 00062 mnum = mask->num_pt ; 00063 00064 00065 /*--- scan through array, find nonzero point, build a cluster, ... ---*/ 00066 00067 INIT_CLARR(clust_arr) ; 00068 00069 ijk_last = 0 ; 00070 do { 00071 switch( ftype ){ 00072 case MRI_short: 00073 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( sfar[ijk] != 0 ) break ; 00074 if( ijk < nxyz ){ 00075 fimv = sfar[ijk] ; sfar[ijk] = 0 ; /* save found point */ 00076 } 00077 break ; 00078 00079 case MRI_byte: 00080 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( bfar[ijk] != 0 ) break ; 00081 if( ijk < nxyz ){ 00082 fimv = bfar[ijk] ; bfar[ijk] = 0 ; /* save found point */ 00083 } 00084 break ; 00085 00086 case MRI_float: 00087 for( ijk=ijk_last ; ijk < nxyz ; ijk++ ) if( ffar[ijk] != 0.0 ) break ; 00088 if( ijk < nxyz ){ 00089 fimv = ffar[ijk] ; ffar[ijk] = 0.0 ; /* save found point */ 00090 } 00091 break ; 00092 } 00093 if( ijk == nxyz ) break ; /* didn't find any! */ 00094 00095 #ifdef CLUST_DEBUG 00096 printf(" starting cluster at ijk=%d\n",ijk) ; 00097 #endif 00098 00099 ijk_last = ijk+1 ; /* start here next time */ 00100 00101 INIT_CLUSTER(clust) ; /* make a new cluster */ 00102 IJK_TO_THREE(ijk,ic,jc,kc,nx,nxy) ; 00103 ADDTO_CLUSTER( clust , ic, jc, kc, fimv ) ; /* start it off */ 00104 00105 /*-- 00106 for each point in cluster: 00107 check points offset by the mask for nonzero entries in fim 00108 enter those into cluster 00109 continue until end of cluster is reached 00110 (note that cluster is expanding as we progress) 00111 --*/ 00112 00113 switch( ftype ){ 00114 case MRI_short: 00115 for( icl=0 ; icl < clust->num_pt ; icl++ ){ 00116 ic = clust->i[icl]; 00117 jc = clust->j[icl]; 00118 kc = clust->k[icl]; 00119 00120 for( jma=0 ; jma < mnum ; jma++ ){ 00121 im = ic + mask->i[jma]; 00122 jm = jc + mask->j[jma]; 00123 km = kc + mask->k[jma]; 00124 if( im < 0 || im >= nx || 00125 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ; 00126 00127 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy); 00128 if( ijkma < ijk_last || ijkma >= nxyz || sfar[ijkma] == 0 ) continue ; 00129 00130 ADDTO_CLUSTER( clust , im, jm, km, sfar[ijkma] ) ; 00131 sfar[ijkma] = 0 ; 00132 } 00133 } 00134 break ; 00135 00136 case MRI_byte: 00137 for( icl=0 ; icl < clust->num_pt ; icl++ ){ 00138 ic = clust->i[icl]; 00139 jc = clust->j[icl]; 00140 kc = clust->k[icl]; 00141 00142 for( jma=0 ; jma < mnum ; jma++ ){ 00143 im = ic + mask->i[jma]; 00144 jm = jc + mask->j[jma]; 00145 km = kc + mask->k[jma]; 00146 if( im < 0 || im >= nx || 00147 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ; 00148 00149 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy); 00150 if( ijkma < ijk_last || ijkma >= nxyz || bfar[ijkma] == 0 ) continue ; 00151 00152 ADDTO_CLUSTER( clust , im, jm, km, bfar[ijkma] ) ; 00153 bfar[ijkma] = 0 ; 00154 } 00155 } 00156 break ; 00157 00158 case MRI_float: 00159 for( icl=0 ; icl < clust->num_pt ; icl++ ){ 00160 ic = clust->i[icl]; 00161 jc = clust->j[icl]; 00162 kc = clust->k[icl]; 00163 00164 for( jma=0 ; jma < mnum ; jma++ ){ 00165 im = ic + mask->i[jma]; 00166 jm = jc + mask->j[jma]; 00167 km = kc + mask->k[jma]; 00168 if( im < 0 || im >= nx || 00169 jm < 0 || jm >= ny || km < 0 || km >= nz ) continue ; 00170 00171 ijkma = THREE_TO_IJK (im, jm, km, nx, nxy); 00172 if( ijkma < ijk_last || ijkma >= nxyz || ffar[ijkma] == 0.0 ) continue ; 00173 00174 ADDTO_CLUSTER( clust , im, jm, km, ffar[ijkma] ) ; 00175 ffar[ijkma] = 0.0 ; 00176 } 00177 } 00178 break ; 00179 } 00180 00181 ADDTO_CLARR(clust_arr,clust) ; 00182 } while( 1 ) ; 00183 00184 KILL_CLUSTER(mask) ; 00185 00186 if( clust_arr->num_clu <= 0 ){ DESTROY_CLARR(clust_arr) ; } 00187 00188 RETURN(clust_arr) ; 00189 } |