std::vector<float> get_scaled_layer_mask( std::vector<uint16_t> labels_, std::set<uint16_t> segment_labels, std::vector<int> & big_to_small, int small_size){ std::vector<float> mask(small_size, 0.0f); std::vector<int> mask_count(small_size, 0); for(uint big_idx = 0; big_idx < big_to_small.size(); big_idx++){ int small_idx = big_to_small[big_idx]; mask_count[small_idx]++; uint16_t label = labels_[big_idx]; if(segment_labels.find(label) != segment_labels.end()) mask[small_idx]++; } for(int i = 0; i < small_size; i++){ mask[i] = mask_count[i] == 0 ? 0.0f : mask[i]/mask_count[i]; } return mask; }
void CowichanSerial::winnow(IntMatrix matrix, BoolMatrix mask, PointVector points) { index_t r, c; index_t len; // number of points index_t stride; // selection stride index_t i, j; // count set cell len = mask_count (mask, nr, nc); if (len < n) { not_enough_points(); } WeightedPointVector weightedPoints = NULL; try { weightedPoints = NEW_VECTOR_SZ(WeightedPoint, len); } catch (...) {out_of_memory();} // fill temporary vector i = 0; for (r = 0; r < nr; r++) { for (c = 0; c < nc; c++) { if (MATRIX_RECT(mask, r, c)) { weightedPoints[i++] = WeightedPoint((real)c, (real)r, MATRIX_RECT(matrix, r, c)); } } } #ifdef SORT_TIME INT64 start, end; start = get_ticks (); #endif // sort std::sort(weightedPoints, &weightedPoints[len]); #ifdef SORT_TIME end = get_ticks (); #endif // copy over points stride = len / n; for (i = n - 1, j = len - 1; i >= 0; i--, j -= stride) { #ifdef WINNOW_OUTPUT std::cout << weightedPoints[j].weight << "\n"; #endif points[i] = weightedPoints[j].point; } #ifdef SORT_TIME std::cout << "winnow sort: "; print_elapsed_time(start, end); std::cout << std::endl; #endif delete [] weightedPoints; }
int main( int argc , char * argv[] ) { int iarg , nvox=0 , iv,ii,cnum , verb=1 ; int automask=1 ; /* allow masks as input 14 Jul 2010 [rickr] */ THD_3dim_dataset *aset , *bset ; byte *amm , *bmm ; int naa , nbb , nabu,nabi , naout , nbout ; float paout , pbout , xrat,yrat,zrat ; float_triple axyz , bxyz ; /*-- read command line arguments --*/ if( argc < 2 || strncmp(argv[1],"-help",5) == 0 ){ printf( "Usage: 3dABoverlap [options] A B\n" "Output (to screen) is a count of various things about how\n" "the automasks of datasets A and B overlap or don't overlap.\n" "\n" "* Dataset B will be resampled to match dataset A, if necessary,\n" " which will be slow if A is high resolution. In such a case,\n" " you should only use one sub-brick from dataset B.\n" " ++ The resampling of B is done before the automask is generated.\n" "* The values output are labeled thusly:\n" " #A = number of voxels in the A mask\n" " #B = number of voxels in the B mask\n" " #(A uni B) = number of voxels in the either or both masks (set union)\n" " #(A int B) = number of voxels present in BOTH masks (set intesection)\n" " #(A \\ B) = number of voxels in A mask that aren't in B mask\n" " #(B \\ A) = number of voxels in B mask that arent' in A mask\n" " %%(A \\ B) = percentage of voxels from A mask that aren't in B mask\n" " %%(B \\ A) = percentage of voxels from B mask that aren't in A mask\n" " Rx(B/A) = radius of gyration of B mask / A mask, in x direction\n" " Ry(B/A) = radius of gyration of B mask / A mask, in y direction\n" " Rz(B/A) = radius of gyration of B mask / A mask, in z direction\n" "* If B is an EPI dataset sub-brick, and A is a skull stripped anatomical\n" " dataset, then %%(B \\ A) might be useful for assessing if the EPI\n" " brick B is grossly misaligned with respect to the anatomical brick A.\n" "* The radius of gyration ratios might be useful for determining if one\n" " dataset is grossly larger or smaller than the other.\n" "\n" "OPTIONS\n" "-------\n" " -no_automask = consider input datasets as masks\n" " (automask does not work on mask datasets)\n" " -quiet = be as quiet as possible (without being entirely mute)\n" " -verb = print out some progress reports (to stderr)\n" "\n" "NOTES\n" "-----\n" " * If an input dataset is comprised of bytes and contains only one\n" " sub-brick, then this program assumes it is already an automask-\n" " generated dataset and the automask operation will be skipped.\n" ) ; PRINT_COMPILE_DATE ; exit(0) ; } iarg = 1 ; /*-- 20 Apr 2001: addto the arglist, if user wants to [RWCox] --*/ /* check options */ while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-verb") == 0 ){ verb++ ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-quiet") == 0 ){ verb = 0 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-no_automask") == 0 ){ automask = 0 ; iarg++ ; continue ; } ERROR_exit("Illegal option: %s",argv[iarg]) ; } mainENTRY("3dOverlap main") ; machdep() ; if( verb ) PRINT_VERSION("3dOverlap") ; AFNI_logger("3dOverlap",argc,argv) ; /* input datasets */ if( iarg+1 >= argc ) ERROR_exit("Need 2 input datasets on command line") ; aset = THD_open_dataset(argv[iarg]) ; CHECK_OPEN_ERROR(aset,argv[iarg]) ; iarg++ ; bset = THD_open_dataset(argv[iarg]) ; CHECK_OPEN_ERROR(bset,argv[iarg]) ; iarg++ ; nvox = DSET_NVOX(aset) ; if( !EQUIV_GRIDS(aset,bset) ){ /** must resample **/ THD_3dim_dataset *cset ; if( verb ) INFO_message("resampling dataset B to match dataset A") ; cset = r_new_resam_dset( bset, aset, 0.0,0.0,0.0,NULL, MRI_BILINEAR, NULL, 1, 0 ) ; DSET_delete(bset) ; bset = cset ; } if( iarg < argc ) WARNING_message("Extra arguments?") ; DSET_load(aset); CHECK_LOAD_ERROR(aset); DSET_load(bset); CHECK_LOAD_ERROR(bset); /* 10 Aug 2009: keep input datasets without automask, if appropriate */ if( DSET_NVALS(aset) > 1 || DSET_BRICK_TYPE(aset,0) != MRI_byte ){ /* allow masks as input (via -no_automask) 14 Jul 2010 [rickr] */ if( automask ) amm = THD_automask(aset); else amm = THD_makemask(aset, 0, 1, 0); /* use any non-zero */ DSET_unload(aset); } else { amm = DSET_BRICK_ARRAY(aset,0) ; } if( DSET_NVALS(bset) > 1 || DSET_BRICK_TYPE(bset,0) != MRI_byte ){ /* allow masks as input (via -no_automask) 14 Jul 2010 [rickr] */ if( automask ) bmm = THD_automask(bset); else bmm = THD_makemask(bset, 0, 1, 0); /* use any non-zero */ DSET_unload(bset); } else { bmm = DSET_BRICK_ARRAY(bset,0) ; } naa = mask_count ( nvox , amm ) ; nbb = mask_count ( nvox , bmm ) ; nabi = mask_intersect_count( nvox , amm , bmm ) ; nabu = mask_union_count ( nvox , amm , bmm ) ; naout = naa - nabi ; nbout = nbb - nabi ; paout = (naa > 0) ? naout/(float)naa : 0.0f ; pbout = (nbb > 0) ? nbout/(float)nbb : 0.0f ; axyz = mask_rgyrate( DSET_NX(aset),DSET_NY(aset),DSET_NZ(aset) , amm ) ; bxyz = mask_rgyrate( DSET_NX(bset),DSET_NY(bset),DSET_NZ(bset) , bmm ) ; xrat = (axyz.a > 0.0f && bxyz.a > 0.0f) ? bxyz.a / axyz.a : 0.0f ; yrat = (axyz.b > 0.0f && bxyz.b > 0.0f) ? bxyz.b / axyz.b : 0.0f ; zrat = (axyz.c > 0.0f && bxyz.c > 0.0f) ? bxyz.c / axyz.c : 0.0f ; if( verb ) printf("#A=%s B=%s\n",DSET_BRIKNAME(aset),DSET_BRIKNAME(bset)) ; if( verb ) printf("#A #B #(A uni B) #(A int B) " "#(A \\ B) #(B \\ A) %%(A \\ B) %%(B \\ A) " "Rx(B/A) Ry(B/A) Rz(B/A)\n") ; printf("%-12d %-12d %-12d %-12d %-12d %-12d %7.4f %7.4f %7.4f %7.4f %7.4f\n", naa , nbb , nabu, nabi, naout,nbout,100.0f*paout,100.0f*pbout, xrat,yrat,zrat ) ; exit(0) ; }