多维图像处理 (scipy.ndimage
)#
简介#
图像处理和分析通常被视为对二维数值数组的操作。然而,在许多领域中,必须对更高维度的图像进行分析。医学成像和生物成像就是很好的例子。由于其固有的多维特性,numpy
非常适合这类应用。scipy.ndimage
包提供了一系列通用的图像处理和分析功能,这些功能设计用于处理任意维度的数组。目前,该包包括:线性和非线性滤波、二值形态学、B样条插值以及对象测量等功能。
滤波函数#
本节中描述的函数都执行某种类型的输入数组的空间滤波:输出中的元素是相应输入元素邻域中元素的某种函数。我们将这些元素的邻域称为滤波核,它通常是矩形形状,但也可能具有任意形状。许多下面描述的函数允许您通过 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]