Source code for ndfilters._median
from typing import Literal
import numpy as np
import numba
import astropy.units as u
import ndfilters
__all__ = [
"median_filter",
]
[docs]
def median_filter(
array: np.ndarray | u.Quantity,
size: int | tuple[int, ...],
axis: None | int | tuple[int, ...] = None,
where: bool | np.ndarray = True,
mode: Literal["mirror", "nearest", "wrap", "truncate"] = "mirror",
) -> np.ndarray:
"""
Calculate a multidimensional rolling median.
Parameters
----------
array
The input array to be filtered
size
The shape of the kernel over which the mean will be calculated.
axis
The axes over which to apply the kernel.
Should either be a scalar or have the same number of items as `size`.
If :obj:`None` (the default) the kernel spans every axis of the array.
where
An optional mask that can be used to exclude parts of the array during
filtering.
mode
The method used to extend the input array beyond its boundaries.
See :func:`scipy.ndimage.generic_filter` for the definitions.
Currently, only "mirror", "nearest", "wrap", and "truncate" modes are
supported.
Returns
-------
A copy of the array with the mean filter applied.
Examples
--------
.. jupyter-execute::
import matplotlib.pyplot as plt
import scipy.datasets
import ndfilters
img = scipy.datasets.ascent()
img_filtered = ndfilters.median_filter(img, size=21)
fig, axs = plt.subplots(ncols=2, sharex=True, sharey=True)
axs[0].set_title("original image");
axs[0].imshow(img, cmap="gray");
axs[1].set_title("filtered image");
axs[1].imshow(img_filtered, cmap="gray");
"""
return ndfilters.generic_filter(
array=array,
function=_median,
size=size,
axis=axis,
where=where,
mode=mode,
)
@numba.njit(cache=True)
def _median(
array: np.ndarray,
args: tuple[float],
) -> float:
return np.median(array)