多维图像处理 (scipy.ndimage)#

简介#

图像处理和分析通常被视为对二维数值数组的操作。然而,在许多领域中,必须对更高维度的图像进行分析。医学成像和生物成像就是很好的例子。由于其固有的多维特性,numpy 非常适合这类应用。scipy.ndimage 包提供了一系列通用的图像处理和分析功能,这些功能设计用于处理任意维度的数组。目前,该包包括:线性和非线性滤波、二值形态学、B样条插值以及对象测量等功能。

所有函数共享的属性#

所有函数共享一些共同的属性。特别地,所有函数都允许通过 output 参数指定输出数组。通过此参数,您可以指定一个数组,该数组将在操作中就地更改以存储结果。在这种情况下,结果不会返回。通常,使用 output 参数更高效,因为现有的数组被用来存储结果。

返回数组的类型取决于操作的类型,但在大多数情况下,它与输入数组的类型相同。然而,如果使用了 output 参数,结果的类型将等于指定输出参数的类型。如果没有给出输出参数,仍然可以指定输出的结果类型。这可以通过简单地将所需的 numpy 类型对象分配给输出参数来完成。例如:

>>> from scipy.ndimage import correlate
>>> import numpy as np
>>> correlate(np.arange(10), [1, 2.5])
array([ 0,  2,  6,  9, 13, 16, 20, 23, 27, 30])
>>> correlate(np.arange(10), [1, 2.5], output=np.float64)
array([  0. ,   2.5,   6. ,   9.5,  13. ,  16.5,  20. ,  23.5,  27. ,  30.5])

滤波函数#

本节中描述的函数都执行某种类型的输入数组的空间滤波:输出中的元素是相应输入元素邻域中元素的某种函数。我们将这些元素的邻域称为滤波核,它通常是矩形形状,但也可能具有任意形状。许多下面描述的函数允许您通过 footprint 参数传递掩码来定义核的形状。例如,可以定义一个十字形核,如下所示:

>>> footprint = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
>>> footprint
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 0]])

通常,核的原点位于通过将核形状的尺寸除以二计算的中心。例如,长度为三的一维核的原点位于第二个元素。以一维数组与长度为三的滤波器(由1组成)的相关性为例:

>>> from scipy.ndimage import correlate1d
>>> a = [0, 0, 0, 1, 0, 0, 0]
>>> correlate1d(a, [1, 1, 1])
array([0, 0, 1, 1, 1, 0, 0])

有时,选择不同的核原点会很方便。为此,大多数函数支持 origin 参数,该参数给出了滤波器相对于其中心的原点。例如:

>>> a = [0, 0, 0, 1, 0, 0, 0]
>>> correlate1d(a, [1, 1, 1], origin = -1)
array([0, 1, 1, 1, 0, 0, 0])

其效果是将结果向左移动。这个特性 不常需要,但可能有用,特别是对于偶数大小的滤波器。一个很好的例子是计算后向和前向差分:

>>> a = [0, 0, 1, 1, 1, 0, 0]
>>> correlate1d(a, [-1, 1])               # 后向差分
array([ 0,  0,  1,  0,  0, -1,  0])
>>> correlate1d(a, [-1, 1], origin = -1)  # 前向差分
array([ 0,  1,  0,  0, -1,  0,  0])

我们也可以如下计算前向差分:

>>> correlate1d(a, [0, -1, 1])
array([ 0,  1,  0,  0, -1,  0,  0])

然而,使用 origin 参数而不是更大的核更高效。对于多维核,origin 可以是一个数字,在这种情况下,假定所有轴上的原点是相等的,或者是一个给出每个轴上原点的序列。

由于输出元素是输入元素邻域中的元素的函数,因此需要通过提供边界外的值来适当地处理数组的边界。这是通过假设数组根据某些边界条件在其边界之外扩展来完成的。在下面描述的函数中,可以通过 mode 参数选择边界条件,该参数必须是包含边界条件名称的字符串。目前支持以下边界条件:

“nearest” 使用边界处的值 [1 2 3]->[1 1 2 3 3] “wrap” 周期性地复制数组 [1 2 3]->[3 1 2 3 1] “reflect” 在边界处反射数组 [1 2 3]->[1 1 2 3 3] “mirror” 在边界处镜像数组 [1 2 3]->[2 1 2 3 2] “constant” 使用常数值,默认是 0.0 [1 2 3]->[0 1 2 3 0]