From a18ea21faf369fe3b043185eaef071a560b86375 Mon Sep 17 00:00:00 2001
From: Christian Kento Rasmussen <christian.kento@gmail.com>
Date: Thu, 8 Feb 2024 09:51:47 +0100
Subject: [PATCH] Created skeleton for 3d connected components class

---
 qim3d/utils/3d_connected_components.py | 66 ++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/qim3d/utils/3d_connected_components.py b/qim3d/utils/3d_connected_components.py
index e69de29b..36f986d2 100644
--- a/qim3d/utils/3d_connected_components.py
+++ b/qim3d/utils/3d_connected_components.py
@@ -0,0 +1,66 @@
+import numpy as np
+from scipy.ndimage import label
+
+
+class ConnectedComponents:
+    def __init__(self, connected_components, num_connected_components):
+        """
+        Initializes a ConnectedComponents object.
+
+        Args:
+            connected_components (np.ndarray): The connected components.
+            num_connected_components (int): The number of connected components.
+        """
+        self._connected_components = connected_components
+        self._num_connected_components = num_connected_components
+
+    @property
+    def connected_components(self):
+        """
+        Get the connected components.
+
+        Returns:
+            np.ndarray: The connected components.
+        """
+        return self._connected_components
+
+    @property
+    def num_connected_components(self):
+        """
+        Get the number of connected components.
+
+        Returns:
+            int: The number of connected components.
+        """
+        return self._num_connected_components
+
+    def get_connected_component(self, index=None):
+        """ 
+        Get the connected component with the given index, if index is None selects a random component.
+
+        Args:
+            index (int): The index of the connected component. If none selects a random component.
+
+        Returns:
+            np.ndarray: The connected component as a binary mask.
+        """
+        assert 1 <= index <= self._num_connected_components, "Index out of range."
+
+        if index:
+            return self._connected_components == index
+        else:
+            return self._connected_components == np.random.randint(1, self._num_connected_components + 1)
+
+
+def get_3d_connected_components(image, connectivity=1):
+    """Get the connected components of a 3D binary image.
+
+    Args:
+        image (np.ndarray): The 3D binary image.
+        connectivity (int, optional): The connectivity of the connected components. Defaults to 1.
+
+    Returns:
+        class: Returns class object of the connected components.
+    """
+    connected_components, num_connected_components = label(image, connectivity)
+    return ConnectedComponents(connected_components, num_connected_components)
-- 
GitLab