nettracer3d 0.5.3__py3-none-any.whl → 0.5.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ from scipy import ndimage
9
9
  from scipy.ndimage import zoom
10
10
  from networkx.algorithms import community
11
11
  from community import community_louvain
12
+ import random
12
13
  from . import node_draw
13
14
 
14
15
 
@@ -781,6 +782,47 @@ def generate_distinct_colors(n_colors: int) -> List[Tuple[int, int, int]]:
781
782
  colors.append(rgb)
782
783
  return colors
783
784
 
785
+ def assign_node_colors(node_list: List[int], labeled_array: np.ndarray) -> Tuple[np.ndarray, Dict[int, str]]:
786
+ """
787
+ Assign distinct colors to nodes and create an RGBA image.
788
+
789
+ Args:
790
+ node_list: List of node IDs
791
+ labeled_array: 3D numpy array with labels corresponding to node IDs
792
+
793
+ Returns:
794
+ Tuple of (RGBA-coded numpy array (H, W, D, 4), dictionary mapping nodes to color names)
795
+ """
796
+
797
+ # Sort communities by size (descending)
798
+ sorted_nodes= sorted(node_list, reverse=True)
799
+
800
+ # Generate distinct colors
801
+ colors = generate_distinct_colors(len(node_list))
802
+ random.shuffle(colors) #Randomly sorted to make adjacent structures likely stand out
803
+
804
+ # Convert RGB colors to RGBA by adding alpha channel
805
+ colors_rgba = [(r, g, b, 255) for r, g, b in colors] # Full opacity for colored regions
806
+
807
+ # Create mapping from community to color
808
+ node_to_color = {node: colors_rgba[i] for i, node in enumerate(sorted_nodes)}
809
+
810
+ # Create RGBA array (initialize with transparent background)
811
+ rgba_array = np.zeros((*labeled_array.shape, 4), dtype=np.uint8)
812
+
813
+ # Assign colors to each voxel based on its label
814
+ for label in np.unique(labeled_array):
815
+ if label in node_to_color: # Skip background (usually label 0)
816
+ mask = labeled_array == label
817
+ for i in range(4): # RGBA channels
818
+ rgba_array[mask, i] = node_to_color[label][i]
819
+
820
+ # Convert the RGB portion of community_to_color back to RGB for color naming
821
+ node_to_color_rgb = {k: tuple(v[:3]) for k, v in node_to_color.items()}
822
+ node_to_color_names = convert_node_colors_to_names(node_to_color_rgb)
823
+
824
+ return rgba_array, node_to_color_names
825
+
784
826
  def assign_community_colors(community_dict: Dict[int, int], labeled_array: np.ndarray) -> Tuple[np.ndarray, Dict[int, str]]:
785
827
  """
786
828
  Assign distinct colors to communities and create an RGBA image.
nettracer3d/nettracer.py CHANGED
@@ -4091,6 +4091,29 @@ class Network_3D:
4091
4091
 
4092
4092
 
4093
4093
  return image, output
4094
+
4095
+ def node_to_color(self, down_factor = None, mode = 0):
4096
+
4097
+ if mode == 0:
4098
+ array = self._nodes
4099
+ elif mode == 1:
4100
+ array = self._edges
4101
+
4102
+ items = list(np.unique(array))
4103
+ if 0 in items:
4104
+ del items[0]
4105
+
4106
+
4107
+ if down_factor is not None:
4108
+ original_shape = array.shape
4109
+ array = downsample(array, down_factor)
4110
+
4111
+ array, output = community_extractor.assign_node_colors(items, array)
4112
+
4113
+ if down_factor is not None:
4114
+ array = upsample_with_padding(array, down_factor, original_shape)
4115
+
4116
+ return array, output
4094
4117
 
4095
4118
 
4096
4119