scipy.ndimage.

morphological_gradient#

scipy.ndimage.morphological_gradient(input, size=None, footprint=None, structure=None, output=None, mode='reflect', cval=0.0, origin=0, *, axes=None)[源代码]#

多维形态学梯度。

形态学梯度计算为输入图像在给定结构元素下的膨胀与腐蚀之差。

参数:
inputarray_like

用于计算形态学梯度的数组。

size整数元组

用于数学形态学操作的平面且完整的结构元素的形状。如果提供了 footprintstructure,则此参数可选。较大的 size 会产生更模糊的梯度。

footprint整数数组,可选

用于形态学操作的平面结构元素中非无穷大元素的位置。更大的 footprint 会产生更模糊的形态学梯度。

structure整数数组,可选

用于形态学操作的结构元素。structure 可以是非平面结构元素。structure 数组会对邻域内的像素应用偏移(偏移量在膨胀期间相加,在腐蚀期间相减)。

output数组,可选

可以提供一个用于存储形态学梯度输出的数组。

mode{'reflect', 'constant', 'nearest', 'mirror', 'wrap'},可选

mode 参数决定了如何处理数组边界,其中当 mode 等于 'constant' 时,cval 是该值。默认为 'reflect'

cval标量,可选

如果 mode 为 'constant',则用于填充输入超出边缘的值。默认值为 0.0。

origin标量,可选

origin 参数控制滤波器的放置。默认为 0

axes整数元组或 None

应用过滤器的轴。如果为 None,则 input 沿所有轴进行过滤。如果提供了 origin 元组,则其长度必须与轴数匹配。

返回:
morphological_gradientndarray

input 的形态学梯度。

附注

对于平面结构元素,在给定点计算的形态学梯度对应于输入图像中,该结构元素所覆盖范围内的元素之间的最大差值(以该点为中心)。

数组 API 标准支持

morphological_gradient 除了 NumPy 之外,还对兼容 Python 数组 API 标准的后端提供了实验性支持。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。目前支持以下后端与设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

示例

>>> from scipy import ndimage
>>> import numpy as np
>>> a = np.zeros((7,7), dtype=int)
>>> a[2:5, 2:5] = 1
>>> ndimage.morphological_gradient(a, size=(3,3))
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0]])
>>> # The morphological gradient is computed as the difference
>>> # between a dilation and an erosion
>>> ndimage.grey_dilation(a, size=(3,3)) -\
...  ndimage.grey_erosion(a, size=(3,3))
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0]])
>>> a = np.zeros((7,7), dtype=int)
>>> a[2:5, 2:5] = 1
>>> a[4,4] = 2; a[2,3] = 3
>>> a
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 3, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 2, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]])
>>> ndimage.morphological_gradient(a, size=(3,3))
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 1, 3, 3, 3, 1, 0],
       [0, 1, 3, 3, 3, 1, 0],
       [0, 1, 3, 2, 3, 2, 0],
       [0, 1, 1, 2, 2, 2, 0],
       [0, 1, 1, 2, 2, 2, 0],
       [0, 0, 0, 0, 0, 0, 0]])