Scikit Image - Morphological Thinning



Morphological thinning is an image processing technique used to extract the skeleton or centerline of objects within binary images. This works on the same principle as skeletonization. It operates by iteratively removing pixels from the borders of objects until no further removal is possible without changing the connectivity or shape of the objects. process is designed to reduce the thickness of the objects while preserving their essential structural features.

The scikit image library provides the thin() function in the morphology module to perform this thinning operation on the images.

Using the skimage.morphology.thin() function

The morphology.thin() function is used to perform morphological thinning on a binary image.

Syntax

Following is the syntax of this function −

skimage.morphology.thin(image, max_num_iter=None)

Parameters

  • image (binary (M, N) ndarray): This parameter is the input binary image on which you want to perform morphological thinning.
  • max_num_iter (int, optional): This parameter allows you to specify the maximum number of iterations to perform during the thinning process. By setting this parameter, you can limit the number of thinning iterations.

Return Value

It returns a binary ndarray of boolean values representing the thinned image.

This algorithm works by repeatedly scanning the image and removing specific pixels to thin connected regions while keeping eight-connected components and 2 x 2 squares. During each step, it checks the surrounding pixels' configuration in relation to a neighborhood mask and refers to a lookup table to decide if the central pixel should be removed in that step.

Example

The following example performs morphological thinning on a binary image using the morphology.thin() function.

import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, morphology
from skimage.util import invert

# Load an image
original_image = io.imread('Images/Black1.png', as_gray=True)
binary_image = invert(original_image)

# Perform morphological thinning
thinned_image = morphology.thin(image)

# Plot the original and thinned images
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
ax = axes.ravel()

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

# Display the Thinned image
ax[1].imshow(thinned_image, cmap=plt.cm.gray)
ax[1].axis('off')
ax[1].set_title('Thinned Image')

plt.tight_layout()
plt.show()

Output

On executing the above program, you will get the following output −

Example

The following example demonestrates how to obtain a partially thinned image using the morphology.thin() function.

import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, morphology
from skimage.util import invert

# Load an image
original_image = io.imread('Images/Black1.png', as_gray=True)
binary_image = invert(original_image)

# Perform morphological thinning 
thinned_image = morphology.thin(binary_image, max_num_iter=6)

# Plot the original and thinned images
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
ax = axes.ravel()

# Display the original binary image
ax[0].imshow(original_image, cmap=plt.cm.gray)
ax[0].axis('off')
ax[0].set_title('Original Binary Image')

# Display the Thinned image
ax[1].imshow(thinned_image, cmap=plt.cm.gray)
ax[1].axis('off')
ax[1].set_title('Partially Thinned Image')

plt.tight_layout()
plt.show()

Output

On executing the above program, you will get the following output −

Advertisements