Scikit Image − Median Filter



The Median filter is a non-linear image processing filter commonly used for noise removal and image smoothing. It operates by computing the local gray-level histogram within a pixel's neighborhood, defined by a 2D structuring element. The key feature of the median filter is that it selects the middle value from this histogram as the filtered value for each pixel. This filter is an excellent choice for smoothing and removing the noise of images while preserving important image details and boundaries.

The Scikit-Image (skimage) provides the median() filters as part of the "rank filters" category to perform these image processing tasks.

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

The rank.median() function is used to compute the local median of an image within a specified neighborhood. This is a rank-based implementation of median filtering specifically designed for unsigned integer images.

Syntax

Following is the syntax of this function −

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

Parameters

Here are the details of its parameters −

  • image: Input image to compute the local mean. It should be a NumPy ndarray with dimensions ([P,] M, N) and dtype (uint8, uint16).
  • footprint: The neighborhood or footprint is expressed as a NumPy ndarray of 1's and 0's. If not provided (set to None), a default square neighborhood of size 3x3 is used.
  • out (optional): If provided, it should be a NumPy array with the same dimensions as the input image ([P,] M, N) array (same dtype as input). If not provided (None), a new array will be allocated for the output.
  • mask (optional): A mask array that can be used to define the area of the image included in the local neighborhood. It is of type integer or float. 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 (optional): 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 ([P,] M, N) ndarray).

Example 1

The following example demonstrates how to Find the local median of the image using a disk-shaped neighborhood −

import matplotlib.pyplot as plt 
from skimage import io, util 
from skimage.morphology import disk 
from skimage.filters.rank import median 
 
# 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 median of the image using a disk-shaped neighborhood 
result = median(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 median')
ax[1].axis('off')
 
plt.tight_layout()
plt.show()

Output

Scikit Median Filter

Example 2

The following example demonstrates noise removal using the rank.median() filter. It adds noise to an image and then applies the median filter with different filter radii to remove the noise efficiently −

from skimage.filters.rank import median 
from skimage.morphology import disk 
import numpy as np 
import matplotlib.pyplot as plt 
from skimage import io, util 
 
# Load the example image as a grayscale image 
image = io.imread('Images/black rose.jpg', as_gray=True)
image = util.img_as_ubyte(image)
 
# Add the noise to the image 
rng = np.random.default_rng()
noise = rng.random(image.shape)
image[noise > 0.99] = 255 
image[noise < 0.01] = 0 
 
# Apply median filtering with different filter radii and display the results 
fig, axes = plt.subplots(2, 2, figsize=(10, 8), sharex=True, sharey=True)
ax = axes.ravel()
 
ax[0].imshow(image, vmin=0, vmax=255, cmap=plt.cm.gray)
ax[0].set_title('Input Noisy image')
 
ax[1].imshow(median(image, disk(1)), vmin=0, vmax=255, cmap=plt.cm.gray)
ax[1].set_title('Median $r=1$')
 
ax[2].imshow(median(image, disk(5)), vmin=0, vmax=255, cmap=plt.cm.gray)
ax[2].set_title('Median $r=5$')
 
ax[3].imshow(median(image, disk(20)), vmin=0, vmax=255, cmap=plt.cm.gray)
ax[3].set_title('Median $r=20$')
 
for a in ax:
   a.axis('off')
 
plt.tight_layout()

Output

Scikit Median Filter
Advertisements