@@ -402,7 +402,7 @@ def volume_per_label(labels, input_file):
402
402
return volumes .tolist (), labels
403
403
404
404
def rescale_by_neighborhood (scalars , indices , neighbor_lists , nedges = 10 , p = 99 ,
405
- set_max_to_1 = True ):
405
+ set_max_to_1 = True , return_list = True ):
406
406
"""
407
407
Rescale the scalar values of a VTK file by a percentile value
408
408
in each vertex's surface mesh neighborhood.
@@ -421,6 +421,8 @@ def rescale_by_neighborhood(scalars, indices, neighbor_lists, nedges=10, p=99,
421
421
percentile used to normalize each scalar
422
422
set_max_to_1 : Boolean
423
423
set all rescaled values greater than 1 to 1.0?
424
+ return_list : Boolean
425
+ return list or numpy array?
424
426
425
427
Returns
426
428
-------
@@ -443,9 +445,10 @@ def rescale_by_neighborhood(scalars, indices, neighbor_lists, nedges=10, p=99,
443
445
>>> nedges = 10
444
446
>>> p = 99
445
447
>>> set_max_to_1 = True
448
+ >>> return_list = True
446
449
>>> #
447
450
>>> rescaled_scalars = rescale_by_neighborhood(scalars, indices,
448
- >>> neighbor_lists, nedges, p)
451
+ >>> neighbor_lists, nedges, p, set_max_to_1, return_list )
449
452
>>> #
450
453
>>> # View rescaled scalar values on folds:
451
454
>>> from mindboggle.utils.io_vtk import rewrite_scalars
@@ -461,11 +464,10 @@ def rescale_by_neighborhood(scalars, indices, neighbor_lists, nedges=10, p=99,
461
464
# Make sure arguments are numpy arrays
462
465
if not isinstance (scalars , np .ndarray ):
463
466
scalars = np .asarray (scalars )
467
+ rescaled_scalars = scalars .copy ()
464
468
465
469
# Loop through all vertices:
466
- rescaled_scalars = - 1 * np .ones (len (scalars ))
467
470
for index in indices :
468
- print ('{0} of {1})' .format (index , len (indices )))
469
471
470
472
# Determine the scalars in the vertex's neighborhood:
471
473
neighborhood = find_neighborhood (neighbor_lists , [index ], nedges )
@@ -481,4 +483,121 @@ def rescale_by_neighborhood(scalars, indices, neighbor_lists, nedges=10, p=99,
481
483
if rescaled_scalars [index ] > 1 :
482
484
rescaled_scalars [index ] = 1.0
483
485
484
- return rescaled_scalars .tolist ()
486
+ if return_list :
487
+ rescaled_scalars = rescaled_scalars .tolist ()
488
+
489
+ return rescaled_scalars
490
+
491
+ def rescale_by_label (input_vtk , labels_or_file , by_neighborhood = True ,
492
+ nedges = 10 , p = 99 , set_max_to_1 = True , save_file = False ,
493
+ output_filestring = 'rescaled_scalars' ):
494
+ """
495
+ Rescale scalars for each label (such as depth values within each fold).
496
+
497
+ Default is to normalize the scalar values of a VTK file by
498
+ a percentile value in each vertex's surface mesh neighborhood for each label.
499
+
500
+ Parameters
501
+ ----------
502
+ input_vtk : string
503
+ name of VTK file with a scalar value for each vertex
504
+ labels_or_file : list or string
505
+ label number for each vertex or name of VTK file with index scalars
506
+ by_neighborhood : Boolean
507
+ rescale by a percentile value in each vertex's surface neighborhood?
508
+ nedges : integer (if norm_by_neighborhood)
509
+ number or edges from vertex, defining the size of its neighborhood
510
+ p : float in range of [0,100] (if norm_by_neighborhood)
511
+ percentile used to rescale each scalar
512
+ set_max_to_1 : Boolean
513
+ set all rescaled values greater than 1 to 1.0?
514
+ save_file : Boolean
515
+ save output VTK file?
516
+ output_filestring : string (if save_file)
517
+ name of output file
518
+
519
+ Returns
520
+ -------
521
+ rescaled_scalars : list of floats
522
+ scalar values rescaled for each label, for label numbers not equal to -1
523
+ rescaled_scalars_file : string (if save_file)
524
+ name of output VTK file with rescaled scalar values for each label
525
+
526
+ Examples
527
+ --------
528
+ >>> # Rescale depths by neighborhood within each subfold:
529
+ >>> import os
530
+ >>> from mindboggle.shapes.measure import rescale_by_label
531
+ >>> path = os.environ['MINDBOGGLE_DATA']
532
+ >>> input_vtk = os.path.join(path, 'arno', 'measures', 'lh.pial.depth.vtk')
533
+ >>> labels_or_file = os.path.join(path, 'arno', 'features', 'subfolds.vtk')
534
+ >>> by_neighborhood = True
535
+ >>> nedges = 10
536
+ >>> p = 99
537
+ >>> set_max_to_1 = True
538
+ >>> save_file = True
539
+ >>> output_filestring = 'rescaled_scalars'
540
+ >>> #
541
+ >>> rescaled_scalars, rescaled_scalars_file = rescale_by_label(input_vtk,
542
+ >>> labels_or_file, by_neighborhood, nedges, p, set_max_to_1,
543
+ >>> save_file, output_filestring)
544
+ >>> #
545
+ >>> # View rescaled scalar values per fold:
546
+ >>> from mindboggle.utils.mesh import plot_vtk
547
+ >>> plot_vtk(rescaled_scalars_file)
548
+
549
+ """
550
+ import os
551
+ import numpy as np
552
+ from mindboggle .utils .io_vtk import read_scalars , rewrite_scalars
553
+ from mindboggle .utils .mesh import find_neighbors_from_file
554
+ from mindboggle .shapes .measure import rescale_by_neighborhood
555
+
556
+ # Load scalars and vertex neighbor lists:
557
+ scalars , name = read_scalars (input_vtk , True , True )
558
+ if by_neighborhood :
559
+ neighbor_lists = find_neighbors_from_file (input_vtk )
560
+ print (" Rescaling scalar values by neighborhood within each label..." )
561
+ else :
562
+ print (" Rescaling scalar values within each label..." )
563
+
564
+ # Load label numbers:
565
+ if isinstance (labels_or_file , str ):
566
+ labels , name = read_scalars (labels_or_file , True , True )
567
+ elif isinstance (labels_or_file , list ):
568
+ labels = labels_or_file
569
+ unique_labels = np .unique (labels )
570
+ unique_labels = [x for x in unique_labels if x >= 0 ]
571
+
572
+ # Loop through labels:
573
+ for label in unique_labels :
574
+ #print(" Rescaling scalar values within label {0} of {1} labels...".format(
575
+ # int(label), len(unique_labels)))
576
+ indices = [i for i ,x in enumerate (labels ) if x == label ]
577
+ if indices :
578
+
579
+ # Rescale by neighborhood:
580
+ if by_neighborhood :
581
+ scalars = rescale_by_neighborhood (scalars ,
582
+ indices , neighbor_lists , nedges , p ,
583
+ set_max_to_1 = True , return_list = False )
584
+
585
+ # Rescale by the maximum label scalar value:
586
+ else :
587
+ scalars [indices ] = scalars [indices ] / np .max (scalars [indices ])
588
+
589
+ rescaled_scalars = scalars .tolist ()
590
+
591
+ #---------------------------------------------------------------------------
592
+ # Return rescaled scalars, number of labels, file name
593
+ #---------------------------------------------------------------------------
594
+ if save_file :
595
+
596
+ rescaled_scalars_file = os .path .join (os .getcwd (), output_filestring + '.vtk' )
597
+ rewrite_scalars (input_vtk , rescaled_scalars_file ,
598
+ rescaled_scalars , 'rescaled_scalars' , labels )
599
+
600
+ else :
601
+ rescaled_scalars_file = None
602
+
603
+ return rescaled_scalars , rescaled_scalars_file
0 commit comments