Scikit Image - Applying Threshold



Thresholding is a fundamental image processing technique used to create a binary image from a grayscale image, where each pixel is classified as either part of the foreground or the background. It is the simplest method of segmenting objects from an image background.

In scikit-image, there are two main categories of thresholding algorithms:

  • Histogram-based Thresholding: These algorithms work based on the histogram of pixel intensities in the image. They often make certain assumptions about the properties of this histogram (e.g. bimodal - having two distinct peaks).
  • Local Thresholding: Local thresholding algorithms consider the neighboring pixels of each pixel in order to determine its classification. These methods often require more computational time because they analyze the surrounding pixels.

Applying Threshold

Applying thresholding involves setting a specific value (threshold) to distinguish between two categories of pixels in an image. In this context, we use the mean value of pixel intensities as a threshold. This method is a relatively straightforward and naive threshold value for separating pixels into two groups.

Example

Here's an example that demonstrates how to apply a simple thresholding algorithm using the mean value of pixel intensities to create a binary image −

import matplotlib.pyplot as plt
from skimage.filters import threshold_mean
from skimage import io

# Load an image 
image = io.imread('Images/image5.jpg', as_gray=True)

# Calculate the mean threshold value
thresh = threshold_mean(image)

# Create a binary image based on the calculated threshold
binary = image > thresh

# Create subplots for the original and thresholded images
fig, axes = plt.subplots(ncols=2, figsize=(10, 5))
ax = axes.ravel()

# Display the original image
ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].set_title('Original image')

# Display the result of thresholding
ax[1].imshow(binary, cmap=plt.cm.gray)
ax[1].set_title('Thresholding Result')

for a in ax:
    a.axis('off')

plt.show()

Output

Threshold

Choosing the right thresholding algorithm for specific data can be challenging, especially if you're not familiar with the details of the different algorithms. therefore, scikit-image provides a function try_all_threshold() within its filter module to evaluate various thresholding algorithms available in the library. This function helps you choose the best-suited algorithm for your specific image data without needing an in-depth understanding of how each algorithm works.

Using the try_all_threshold() function

The filters.try_all_threshold() function is used to generate a figure that provides visual comparisons of the outputs of different thresholding methods applied to an input image −

Syntax

Following is the syntax of this function −

skimage.filters.try_all_threshold(image, figsize=(8, 5), verbose=True)

Parameters

Here are the details of the parameters −

  • image (N, M) ndarray: This is the input image on which you want to compare different thresholding methods.
  • figsize (tuple, optional): This parameter specifies the size of the resulting Matplotlib figure in inches.
  • verbose (bool, optional): If set to True, this parameter will print the name of each thresholding method being applied.

Return value

The function returns a tuple containing a Matplotlib figure (fig) and a set of axes (ax) for the generated comparison figure.

Example

Here is an example of how to use the filters.try_all_threshold() function to compare different thresholding methods on an image −

import matplotlib.pyplot as plt
from skimage import io, filters

# Load an example image
image = io.imread('Images/Tajmahal_2.jpg', as_gray=True)

# Generate the comparison figure for all thresholding methods
fig, ax = filters.try_all_threshold(image, figsize=(12, 15), verbose=True)

# Display the figure with comparisons
plt.show()

Output

Threshold
Advertisements