scipy的ndimage滤波器中的“reflect”模式是如何工作的?

18 投票
1 回答
8474 浏览
提问于 2025-04-18 00:01

我不太明白反射模式是怎么处理我的数组的。我有一个非常简单的数组:

import numpy as np
from scipy.ndimage.filters import uniform_filter
from scipy.ndimage.filters import median_filter

vector = np.array([[1.0,1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0,2.0],[4.0,4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0,5.0]])

print(vector)

[[ 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2.] [ 4. 4. 4. 4. 4.] [ 5. 5. 5. 5. 5.]]

我用大小为3的均匀(平均)滤波器处理这个数组,得到了以下结果:

filtered = uniform_filter(vector, 3, mode='reflect')

print(filtered)

[[ 1.33333333 1.33333333 1.33333333 1.33333333 1.33333333] [ 2.33333333 2.33333333 2.33333333 2.33333333 2.33333333] [ 3.66666667 3.66666667 3.66666667 3.66666667 3.66666667] [ 4.66666667 4.66666667 4.66666667 4.66666667 4.66666667]]

如果我试着手动计算这个过程,我可以得到这个结果。原始矩阵用绿色表示,窗口用橙色表示,结果用黄色表示。白色部分是“反射”的观察值。

enter image description here

结果是:

enter image description here

但是当我尝试窗口大小为4或5时,我就无法复制出结果。

filtered = uniform_filter(vector, 4, mode='reflect')

print(filtered)

[[ 1.5 1.5 1.5 1.5 1.5] [ 2. 2. 2. 2. 2. ] [ 3. 3. 3. 3. 3. ] [ 4. 4. 4. 4. 4. ]]

手动计算的过程:

enter image description here

我得到的结果是:

enter image description here

如果窗口的大小是偶数,应该怎么处理呢?不过无论如何,如果我尝试复制大小为5的窗口的结果,使用反射模式我也做不到。尽管我认为它的行为应该和大小为3的情况类似。

1 个回答

48

假设有一组数据在一个轴上,内容是 1 2 3 4 5 6 7 8。下面的表格展示了在每种模式下,数据是如何扩展的(假设 cval=0):

    mode       |   Ext   |         Input          |   Ext
    -----------+---------+------------------------+---------
    'mirror'   | 4  3  2 | 1  2  3  4  5  6  7  8 | 7  6  5
    'reflect'  | 3  2  1 | 1  2  3  4  5  6  7  8 | 8  7  6
    'nearest'  | 1  1  1 | 1  2  3  4  5  6  7  8 | 8  8  8
    'constant' | 0  0  0 | 1  2  3  4  5  6  7  8 | 0  0  0
    'wrap'     | 6  7  8 | 1  2  3  4  5  6  7  8 | 1  2  3

对于一个偶数的窗口大小 n,我们考虑一个大小为 n+1 的窗口,然后不包括左边和下边的边缘。(窗口的位置可以通过使用 origin 参数来改变。)

撰写回答