Diff of /src/histogram.py [000000] .. [602ab8]

Switch to side-by-side view

--- a
+++ b/src/histogram.py
@@ -0,0 +1,81 @@
+from __future__ import print_function
+
+import os
+import numpy as np
+from tqdm import *
+import nibabel as nib
+from math import factorial
+import matplotlib.pyplot as plt
+
+
+def load_nii(path):
+    return nib.load(path).get_data()
+
+
+def compute_hist(volume, bins_num):
+    bins = np.arange(0, bins_num)
+    hist = np.histogram(volume, bins=bins, density=True)
+    return hist[1][2:], hist[0][1:]
+
+
+def savitzky_golay(y, window_size, order, deriv=0, rate=1):
+    try:
+        window_size = np.abs(np.int(window_size))
+        order = np.abs(np.int(order))
+    except ValueError:
+        raise ValueError("window_size and order have to be of type int")
+
+    if window_size % 2 != 1 or window_size < 1:
+        raise TypeError("window_size size must be a positive odd number")
+    if window_size < order + 2:
+        raise TypeError("window_size is too small for the polynomials order")
+
+    order_range = range(order + 1)
+    half_window = (window_size - 1) // 2
+
+    b = np.mat([[k ** i for i in order_range] for k in range(-half_window, half_window + 1)])
+    m = np.linalg.pinv(b).A[deriv] * rate**deriv * factorial(deriv)
+
+    firstvals = y[0] - np.abs(y[1:half_window + 1][::-1] - y[0])
+    lastvals = y[-1] + np.abs(y[-half_window - 1:-1][::-1] - y[-1])
+    y = np.concatenate((firstvals, y, lastvals))
+    return np.convolve(m[::-1], y, mode='valid')
+
+
+def plot_hist(infos, bins_num):
+    plt.figure()
+    plt.title("Histogram of All Difference Volumes", fontsize=12)
+    for info in tqdm(infos):
+        path, label = info[0], info[1]
+        color = "r" if label == "AD" else "b"
+        volume = load_nii(path)
+        x, y = compute_hist(volume, bins_num)
+        non_zero_idx = np.where(y > 0)
+        x = x[non_zero_idx]
+        y = y[non_zero_idx]
+        y = savitzky_golay(y, 9, 0)
+        plt.plot(x, y, color, lw=0.3, alpha=0.5, label=label)
+    handles, labels = plt.gca().get_legend_handles_labels()
+    labels, ids = np.unique(labels, return_index=True)
+    handles = [handles[i] for i in ids]
+    plt.legend(handles, labels, loc='best')
+    plt.xlabel("Intensity", fontsize=14)
+    plt.ylabel("Density", fontsize=14)
+    plt.grid("on", linestyle="--", linewidth=0.5)
+    plt.show()
+    return
+
+
+parent_dir = os.path.dirname(os.getcwd())
+data_dir = os.path.join(parent_dir, "data")
+data_src_dir = os.path.join(data_dir, "ADNIEnhance")
+data_labels = ["AD", "NC"]
+
+data_src_infos = []
+for label in data_labels:
+    src_label_dir = os.path.join(data_src_dir, label)
+    for subject in os.listdir(src_label_dir):
+        data_src_infos.append([os.path.join(src_label_dir, subject), label])
+
+bins_num = 256
+plot_hist(data_src_infos, bins_num)