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.
- nettracer3d/community_extractor.py +42 -0
- nettracer3d/nettracer.py +23 -0
- nettracer3d/nettracer_gui.py +556 -99
- nettracer3d/segmenter.py +577 -80
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/METADATA +7 -6
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/RECORD +10 -10
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/WHEEL +1 -1
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/LICENSE +0 -0
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/entry_points.txt +0 -0
- {nettracer3d-0.5.3.dist-info → nettracer3d-0.5.5.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|