spline_filter#
- scipy.ndimage.spline_filter(input, order=3, output=<class 'numpy.float64'>, mode='mirror')[source]#
多维样条滤波器。
- 参数:
- inputarray_like
输入数组。
- orderint, optional
样条曲线的阶数,默认为 3。
- outputndarray 或 dtype,可选
用于存放输出的数组,或返回数组的数据类型。默认为
numpy.float64。- mode{‘reflect’, ‘grid-mirror’, ‘constant’, ‘grid-constant’, ‘nearest’, ‘mirror’, ‘grid-wrap’, ‘wrap’}, optional
mode 参数决定了输入数组在边界之外如何进行扩展。默认为 ‘mirror’。每个有效值的行为如下(详见 边界模式 中的附加图表和详细信息)
- 'reflect' (d c b a | a b c d | d c b a)
输入通过最后像素的边缘反射进行扩展。此模式有时也称为半样本对称。
- ‘grid-mirror’
这是 ‘reflect’ 的同义词。
- 'constant' (k k k k | a b c d | k k k k)
输入通过用由
cval参数定义的相同常数值填充所有边界之外的值来扩展。在输入边界之外不执行插值。- ‘grid-constant’ (k k k k | a b c d | k k k k)
输入通过用由
cval参数定义的相同常数值填充所有边界之外的值来扩展。插值也发生在输入范围之外的样本上。- 'nearest' (a a a a | a b c d | d d d d)
输入通过复制最后像素进行扩展。
- 'mirror' (d c b | a b c d | c b a)
输入通过最后像素的中心反射进行扩展。此模式有时也称为全样本对称。
- ‘grid-wrap’ (a b c d | a b c d | a b c d)
输入通过环绕到对边进行扩展。
- ‘wrap’ (b c d b c | a b c d | b c a b c)
输入通过环绕到相反的边缘来扩展,但方式是使最后一个点和初始点完全重叠。在这种情况下,在重叠点处选择哪个样本并未明确定义。
对于上面说明的示例,边缘值
a和d重叠,而内部模式b c重复。该示例展示了一种可能的输出,而b c a b c | a b c d | b c d b c是另一种,因为在每个重叠点处都可能出现a或d。
- 返回:
- spline_filterndarray
滤波后的数组。形状与 input 相同。
另请参阅
一维样条滤波沿给定轴计算一维样条滤波器。
附注
该多维滤波器作为一系列一维样条滤波器实现。中间数组以与输出相同的数据类型存储。因此,对于精度有限的输出类型,结果可能会因为中间结果的存储精度不足而不准确。
对于复数类型的 input,此函数会分别处理其实部和虚部。
1.6.0 版本已添加: 添加了复值支持。
数组 API 标准支持
spline_filter除了支持 NumPy 外,还对符合 Python 数组 API 标准的后端提供了实验性支持。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。目前支持以下后端和设备(或其他功能)的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
✅
PyTorch
✅
⛔
JAX
⚠️ 无 JIT
⛔
Dask
⚠️ 计算图
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
示例
我们可以使用多维样条对图像进行滤波
>>> from scipy.ndimage import spline_filter >>> import numpy as np >>> import matplotlib.pyplot as plt >>> orig_img = np.eye(20) # create an image >>> orig_img[10, :] = 1.0 >>> sp_filter = spline_filter(orig_img, order=3) >>> f, ax = plt.subplots(1, 2, sharex=True) >>> for ind, data in enumerate([[orig_img, "original image"], ... [sp_filter, "spline filter"]]): ... ax[ind].imshow(data[0], cmap='gray_r') ... ax[ind].set_title(data[1]) >>> plt.tight_layout() >>> plt.show()