Diff of /utils/preprocessor.py [000000] .. [6f9c00]

Switch to side-by-side view

--- a
+++ b/utils/preprocessor.py
@@ -0,0 +1,83 @@
+import numpy as np
+
+ORIENTATION = {
+    'coronal': "COR",
+    'axial': "AXI",
+    'sagital': "SAG"
+}
+
+
+def rotate_orientation(volume_data, volume_label, orientation=ORIENTATION['coronal']):
+    if orientation == ORIENTATION['coronal']:
+        return volume_data.transpose((2, 0, 1)), volume_label.transpose((2, 0, 1))
+    elif orientation == ORIENTATION['axial']:
+        return volume_data.transpose((1, 2, 0)), volume_label.transpose((1, 2, 0))
+    elif orientation == ORIENTATION['sagital']:
+        return volume_data, volume_label
+    else:
+        raise ValueError("Invalid value for orientation. Pleas see help")
+
+
+def estimate_weights_mfb(labels):
+    class_weights = np.zeros_like(labels)
+    unique, counts = np.unique(labels, return_counts=True)
+    median_freq = np.median(counts)
+    weights = np.zeros(33)
+    for i, label in enumerate(unique):
+        class_weights += (median_freq // counts[i]) * np.array(labels == label)
+        weights[int(label)] = median_freq // counts[i]
+
+    grads = np.gradient(labels)
+    edge_weights = (grads[0] ** 2 + grads[1] ** 2) > 0
+    class_weights += 2 * edge_weights
+    return class_weights, weights
+
+
+def remap_labels(labels, remap_config):
+    """
+    Function to remap the label values into the desired range of algorithm
+    """
+    if remap_config == 'FS':
+        label_list = [2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 24, 26, 28, 41, 42, 43, 44, 46, 47, 49, 50,
+                      51, 52, 53, 54, 58, 60]
+    elif remap_config == 'Neo':
+        labels[(labels >= 100) & (labels % 2 == 0)] = 210
+        labels[(labels >= 100) & (labels % 2 == 1)] = 211
+        label_list = [45, 211, 52, 50, 41, 39, 60, 37, 58, 56, 4, 11, 35, 48, 32, 46, 30, 62, 44, 210, 51, 49, 40, 38,
+                      59, 36, 57, 55, 47, 31, 23, 61]
+    else:
+        raise ValueError("Invalid argument value for remap config, only valid options are FS and Neo")
+
+    new_labels = np.zeros_like(labels)
+
+    for i, label in enumerate(label_list):
+        label_present = np.zeros_like(labels)
+        label_present[labels == label] = 1
+        new_labels = new_labels + (i + 1) * label_present
+
+    return new_labels
+
+
+def reduce_slices(data, labels, skip_Frame=40):
+    """
+    This function removes the useless black slices from the start and end. And then selects every even numbered frame.
+    """
+    no_slices, H, W = data.shape
+    mask_vector = np.zeros(no_slices, dtype=int)
+    mask_vector[::2], mask_vector[1::2] = 1, 0
+    mask_vector[:skip_Frame], mask_vector[-skip_Frame:-1] = 0, 0
+
+    data_reduced = np.compress(mask_vector, data, axis=0).reshape(-1, H, W)
+    labels_reduced = np.compress(mask_vector, labels, axis=0).reshape(-1, H, W)
+
+    return data_reduced, labels_reduced
+
+
+def remove_black(data, labels):
+    clean_data, clean_labels = [], []
+    for i, frame in enumerate(labels):
+        unique, counts = np.unique(frame, return_counts=True)
+        if counts[0] / sum(counts) < .99:
+            clean_labels.append(frame)
+            clean_data.append(data[i])
+    return np.array(clean_data), np.array(clean_labels)