Scikit Image − Morphological gray-level Filters



In grayscale image processing, the maximum and minimum filters are base operators to identify the local maximum and minimum values within an image. These Local maximum and minimum filters are fundamental operators in gray-level morphology.

The Scikit-Image (skimage) provides the maximum and minimum filters as part of the "rank filters" category. They operate on local neighborhoods of pixels, which are defined by 2D structuring elements. And are particularly useful for various image-processing tasks, including noise reduction, feature detection, and morphological operations.

Using the skimage.filters.rank.maximum() function

The filters.rank.maximum() function is used for finding the local maximum values within an image using a specified neighborhood or footprint.

Syntax

Following is the syntax of this function −

skimage.filters.rank.maximum(image, footprint, out=None, mask=None, shift_x=False, shift_y=False, shift_z=False)

Parameters

Here are the details of its parameters −

  • Image ([P,] M, N) ndarray (uint8, uint16): This is the input image on which the local maximum operation will be performed.
  • Footprint (ndarray): This parameter specifies the neighborhood or footprint used for local maximum computation. The NumPy array contains 1s and 0s.
  • Out (optional, ([P,] M, N) array (same dtype as input)): This parameter is used to store the output of the local maximum operation. If specified, it should be a NumPy array of the same shape as the input image. If not specified(set to None), a new array will be allocated for the output.
  • Mask (optional, ndarray (integer or float), optional): Mask array that can be used to define the area of the image included in the local neighborhood. Pixels with values greater than 0 in the mask are included in the neighborhood calculation. If not provided (None), the complete image is used by default.
  • Shift_x, shift_y, shift_z: These parameters specify an offset added to the center point of the footprint. The shift is bounded to the footprint sizes, meaning the center must remain inside the given footprint.

Return value

The function returns an output image, which is a NumPy array of the same data type as the input image. It is important to note that the function is particularly efficient for larger images and footprints due to its lower algorithm complexity.

Example

The following example finds the local maximum values for each pixel in the input image, based on the given footprint −

import matplotlib.pyplot as plt
from skimage import io, util
from skimage.morphology import disk
from skimage.filters.rank import maximum

# Load the example image as a grayscale image
image = io.imread('Images/black rose.jpg', as_gray=True)
image = util.img_as_ubyte(image)

# Finding the local maximum of the image using a disk-shaped neighborhood
result = maximum(image, disk(5))

# Plot the original image and the result
fig, axes = plt.subplots(1, 2, figsize=(15, 5))
ax = axes.ravel()

# Display the Original Image
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[0].axis('off')

# Display the Result
ax[1].imshow(result, cmap='gray')
ax[1].set_title('Resultant image after calculating the local maximum')
ax[1].axis('off')

plt.tight_layout()
plt.show()

Output

Gray Filter

Using the skimage.filters.rank.minimum() function

The filters.rank.minimum() function is similar to skimage.filters.rank.maximum, but it computes the local minimum instead of the local maximum within an image using a specified neighborhood or footprint.

Syntax

Following is the syntax of this function −

skimage.filters.rank.minimum(image, footprint, out=None, mask=None, shift_x=False, shift_y=False, shift_z=False)

Parameters

Here are the details of its parameters −

  • Image ([P,] M, N) ndarray (uint8, uint16): This is the input image on which the local minimum operation will be performed.
  • Footprint (ndarray): This parameter specifies the neighborhood or footprint used for local maximum computation. The NumPy array contains 1s and 0s.
  • Out (optional, ([P,] M, N) array (same dtype as input)): This parameter is used to store the output of the local maximum operation. If specified, it should be a NumPy array of the same shape as the input image. If not specified(set to None), a new array will be allocated for the output.
  • Mask (optional, ndarray (integer or float), optional): Mask array that can be used to define the area of the image included in the local neighborhood. Pixels with values greater than 0 in the mask are included in the neighborhood calculation. If not provided (None), the complete image is used by default.
  • Shift_x, shift_y, shift_z: These parameters specify an offset added to the center point of the footprint. The shift is bounded to the footprint sizes, meaning the center must remain inside the given footprint.

Return value

The function returns an output image, which is a NumPy array of the same data type as the input image.

It is important to note that the function is particularly efficient for larger images and footprints due to its lower algorithm complexity.

Example 1

The following example finds the local minimum values for each pixel in the input image, based on the given footprint −

import matplotlib.pyplot as plt
from skimage import io, util
from skimage.morphology import disk
from skimage.filters.rank import minimum

# Load the example image as a grayscale image
image = io.imread('Images/black rose.jpg', as_gray=True)
image = util.img_as_ubyte(image)

# Finding the local minimum of the image using a disk-shaped neighborhood
result = minimum(image, disk(5))

# Plot the original image and the result
fig, axes = plt.subplots(1, 2, figsize=(15, 5))
ax = axes.ravel()

# Display the Original Image
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[0].axis('off')

# Display the Result
ax[1].imshow(result, cmap='gray')
ax[1].set_title('Resultant image after calculating the local minimum')
ax[1].axis('off')

plt.tight_layout()
plt.show()

Output

Gray Filter

Example 2

The following example demonstrates the use of morphological gray-level filters, specifically opening, and closing, using the skimage.filters.rank.maximum() and skimage.filters.rank.minimum() functions −

from skimage.filters.rank import maximum, minimum
from skimage import io, util
import matplotlib.pyplot as plt

# Load an example image and convert it to a grayscale image
noisy_image = util.img_as_ubyte(io.imread('Images/image5.jpg', as_gray=True))

# Perform gray-level closing and opening morphological operations using disk-shaped neighborhoods
opening = maximum(minimum(noisy_image, disk(5)), disk(5))
closing = minimum(maximum(noisy_image, disk(5)), disk(5))

# Display the original image, gray-level closing, and opening result
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 10))
ax = axes.ravel()

ax[0].imshow(noisy_image, cmap=plt.cm.gray)
ax[0].set_title('Original')

ax[1].imshow(closing, cmap=plt.cm.gray)
ax[1].set_title('Gray-level closing')

ax[2].imshow(opening, cmap=plt.cm.gray)
ax[2].set_title('Gray-level opening')

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

plt.tight_layout()
plt.show()

Output

Gray Filter
Advertisements