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]