In our previous chapter, we explored the concept of image erosion, an operation used to shrink all the pixels to the boundaries of regions in an image. Conditional erosion on the other hand, shrinks (remove) the pixels of certain specific regions, based on some conditions.
The condition can be based on the intensity values of the image pixels or some specific pattern in the image.
For example, let”s consider a grayscale image. Instead of eroding all the foreground pixels, you could conditionally erode only those pixels that meet a certain intensity threshold.
If a pixel”s intensity is below a predefined threshold, then erosion is applied; otherwise, the pixel remains unchanged.
Conditional Eroding Image in Mahotas
In mahotas, conditional erosion is an extension of the traditional erosion operation that comprises a condition based on a second image, often referred to as the “marker image.”
It allows you to control the erosion process such that erosion only occurs at locations where the marker image has specific pixel values.
We can perform the conditional erosion on an image in mahotas using the cerode() function. This function restricts the erosion process to specific regions based on the marker image”s pixel values.
The mahotas.cerode() function
The cerode() function in Mahotas takes two inputs− the input image and a mask (condition) array. It performs conditional erosion on the input image based on the provided condition, and it returns the resulting eroded image.
Masks are used to identify specific regions within an image. They act as a filter that highlights certain areas while disregarding others.
Syntax
Following is the basic syntax of the cerode() function in mahotas −
mahotas.cerode(f, g, Bc={3x3 cross}, out={np.empty_as(A)})
Where,
-
f − It is the input image on which the conditional erosion is to be performed.
-
g − It is the mask to be applied during conditional erosion.
-
Bc={3×3 cross} (optional) − It is a structuring element used for dilation. Default is {3×3 cross}.
-
out={np.empty_as(A)} (optional) − It provides an output array to store the result of the erosion operation
Example
In the following example, we are performing the conditional erosion on an image by scaling down its pixel intensity −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image= mh.imread(''nature.jpeg'') # Define the scaling factor scale_factor = 0.5 # Scale down the intensity by multiplying with the scale factor scaled_image = image * scale_factor # Convert the scaled image to the appropriate data type scaled_image = scaled_image.astype(np.uint8) conditional_eroded_image = mh.cerode(image, scaled_image) # Create a figure with subplots fig, axes = plt.subplots(1, 2, figsize=(7,5 )) # Display the original image axes[0].imshow(image) axes[0].set_title(''Original Image'') axes[0].axis(''off'') # Display the conditional eroded image axes[1].imshow(conditional_eroded_image, cmap=''gray'') axes[1].set_title(''Conditional Eroded Image'') axes[1].axis(''off'') # Adjust the layout and display the plot plt.tight_layout() plt.show()
Output
After executing the above code, we get the following output −
Using Structuring Element
To perform conditional erosion using structuring element in Mahotas, first, we need to define the condition based on which the erosion will be applied. For example, you can specify a condition based on pixel intensity or provide a binary mask.
Next, choose a structuring element that defines the neighborhood for erosion. Mahotas provides several pre−defined structuring elements, such as disks and squares, which you can select based on the desired shape and size.
Finally, retrieve the resulting image, which will contain the erosion effects only where the condition is satisfied.
Example
In here, we are trying to perform conditional erosion on an image using structuring elements −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image= mh.imread(''nature.jpeg'', as_grey = True).astype(np.uint8) # Define the condition based on pixel intensity condition = image > 0.5 # Define a structuring element for erosion structuring_element = mh.disk(5) conditional_eroded_image = mh.cerode(image, condition, structuring_element) # Create a figure with subplots fig, axes = plt.subplots(1, 2, figsize=(7,5 )) # Display the original image axes[0].imshow(image) axes[0].set_title(''Original Image'') axes[0].axis(''off'') # Display the conditional eroded image axes[1].imshow(conditional_eroded_image, cmap=''gray'') axes[1].set_title(''Conditional Eroded Image'') axes[1].axis(''off'') # Adjust the layout and display the plot plt.tight_layout() plt.show()
Output
The output obtained is as shown below −
Using a Custom Condition Function
We can also perform conditional erosion on an image using a custom condition function.
To achieve this, we first define a custom condition function that determines which pixels should undergo erosion.
Next, choose a structuring element to define the shape and size of erosion operation. Finally, perform the conditional erosion and retrieve the eroded image.
Example
Now, we are dilating an image using a custom condition function −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt # Load image image = mh.imread(''sea.bmp'', as_grey=True).astype(np.uint8) # Define a custom condition function def custom_condition(pixel_value): return pixel_value > 0.5 # Define a structuring element structuring_element = mh.disk(5) # Create a binary mask based on the custom condition function condition = custom_condition(image) # Perform conditional erosion conditional_eroded_image = mh.cerode(image, condition, structuring_element) # Create a figure with subplots fig, axes = plt.subplots(1, 2, figsize=(7,5 )) # Display the original image axes[0].imshow(image) axes[0].set_title(''Original Image'') axes[0].axis(''off'') # Display the conditional eroded image axes[1].imshow(conditional_eroded_image, cmap=''gray'') axes[1].set_title(''Conditional Eroded Image'') axes[1].axis(''off'') # Adjust the layout and display the plot plt.tight_layout() plt.show()
Output
Following is the output of the above code −