Source code for dipy.segment.threshold

import numpy as np

from dipy.testing.decorators import warning_for_keywords


[docs] @warning_for_keywords() def otsu(image, *, nbins=256): """ Return threshold value based on Otsu's method. Copied from scikit-image to remove dependency. Parameters ---------- image : array Input image. nbins : int Number of bins used to calculate histogram. This value is ignored for integer arrays. Returns ------- threshold : float Threshold value. """ hist, bin_centers = np.histogram(image, nbins) hist = hist.astype(float) # class probabilities for all possible thresholds weight1 = np.cumsum(hist) weight2 = np.cumsum(hist[::-1])[::-1] # class means for all possible thresholds mean1 = np.cumsum(hist * bin_centers[1:]) / weight1 mean2 = (np.cumsum((hist * bin_centers[1:])[::-1]) / weight2[::-1])[::-1] # Clip ends to align class 1 and class 2 variables: # The last value of `weight1`/`mean1` should pair with zero values in # `weight2`/`mean2`, which do not exist. variance12 = weight1[:-1] * weight2[1:] * (mean1[:-1] - mean2[1:]) ** 2 idx = np.argmax(variance12) threshold = bin_centers[:-1][idx] return threshold
[docs] @warning_for_keywords() def upper_bound_by_rate(data, *, rate=0.05): r"""Adjusts upper intensity boundary using rates It calculates the image intensity histogram, and based on the rate value it decide what is the upperbound value for intensity normalization, usually lower bound is 0. The rate is the ratio between the amount of pixels in every bins and the bins with highest pixel amount Parameters ---------- data : float Input intensity value data rate : float representing the threshold whether a specific histogram bin that should be count in the normalization range Returns ------- high : float the upper_bound value for normalization """ g, h = np.histogram(data) m = np.zeros((10, 3)) high = data.max() for i in np.array(range(10)): m[i, 0] = g[i] m[i, 1] = h[i] m[i, 2] = h[i + 1] g = sorted(g, reverse=True) sz = np.size(g) Index = 0 for i in np.array(range(sz)): if g[i] / g[0] > rate: Index = Index + 1 for i in np.array(range(10)): for j in np.array(range(Index)): if g[j] == m[i, 0]: high = m[i, 2] return high
[docs] @warning_for_keywords() def upper_bound_by_percent(data, *, percent=1): """Find the upper bound for visualization of medical images Calculate the histogram of the image and go right to left until you find the bound that contains more than a percentage of the image. Parameters ---------- data : ndarray percent : float Returns ------- upper_bound : float """ percent = percent / 100.0 values, bounds = np.histogram(data, 20) total_voxels = np.prod(data.shape) agg = 0 for i in range(len(values) - 1, 0, -1): agg += values[i] if agg / float(total_voxels) > percent: return bounds[i]