In image processing, the balanced histogram thresholding method (BHT),[1] is a very simple method used for automatic image thresholding. Like Otsu's Method[2] and the Iterative Selection Thresholding Method,[3] this is a histogram based thresholding method. This approach assumes that the image is divided in two main classes: The background and the foreground. The BHT method tries to find the optimum threshold level that divides the histogram in two classes.This method weighs the histogram, checks which of the two sides is heavier, and removes weight from the heavier side until it becomes the lighter. It repeats the same operation until the edges of the weighing scale meet.
Given its simplicity, this method is a good choice as a first approach when presenting the subject of automatic image thresholding.
The following listing, in C notation, is a simplified version of the Balanced Histogram Thresholding method:
The following, is a possible implementation in the Python language:
def balanced_histogram_thresholding(histogram, minimum_bin_count: int = 5) -> int: """ Determines an optimal threshold by balancing the histogram of an image, focusing on significant histogram bins to segment the image into two parts.
This function iterates through the histogram to find a threshold that divides the histogram into two parts with a balanced sum of bin counts on each side. It effectively segments the image into foreground and background based on this threshold. The algorithm ignores bins with counts below a specified minimum, ensuring that noise or very low-frequency bins do not affect the thresholding process.
Args: histogram (np.ndarray): The histogram of the image as a 1D numpy array, where each element represents the count of pixels at a specific intensity level. minimum_bin_count (int): Minimum count for a bin to be considered in the thresholding process. Bins with counts below this value are ignored, reducing the effect of noise.
Returns: int: The calculated threshold value. This value represents the intensity level (i.e. the index of the input histogram) that best separates the significant parts of the histogram into two groups, which can be interpreted as foreground and background. If the function returns -1, it indicates that the algorithm was unable to find a suitable threshold within the constraints (e.g., all bins are below the minimum_bin_count).
""" start_index = 0 while histogram[start_index] < minimum_bin_count and start_index < len(histogram) - 1: start_index += 1 end_index = len(histogram) - 1 while histogram[end_index] < minimum_bin_count and end_index > 0: end_index -= 1
if start_index >= end_index: return -1 # Indicates an error or non-applicability
threshold = (start_index + end_index) // 2
while True: weight_left = np.sum(histogram[start_index:threshold]) weight_right = np.sum(histogram[threshold:end_index + 1])
if weight_left > weight_right: end_index = threshold - 1 else: start_index = threshold + 1
new_threshold = (start_index + end_index) // 2
if new_threshold
return threshold