skimage 意味着没有返回预期结果?

skimage mean is not returning expected result?

我有以下代码:

结果中的中心条目(在索引 [1,1] 处)不应该是 (2+4+5+5+7)/9 = int(2.55) = 2 吗?

我想象当被视为卷积时会发生以下情况:

import numpy as np
from skimage.filters.rank import mean
from skimage.morphology import disk
A = np.array([[1,2,3], [4,5,6], [7,8,9]])
print("A: {}".format(A))
print("disk(1): {}".format(disk(1)))
print("mean: {}".format(mean(A, disk(1))))

我们的内核是 K = 1/9(disk(1)),输入图像是 A,导致卷积(将数组视为离散函数):A * K。因此,我希望 A 中的中心像素会根据卷积的定义变成 (2+4+5+5+7)/9 = int(2.55) = 2。为什么这不是真的?

skimage.filters.rank.mean 计算选择元素中值为 1 的像素的平均值,而不是整个 window 的平均值。如果传入 disk(1) 作为选择元素,则邻域仅由 5 个像素组成,而不是 9 个像素。因此,卷积核的归一化因子应为 1/5 而不是 1/9。

演示

In [77]: import numpy as np
    ...: from skimage.filters.rank import mean
    ...: from skimage.morphology import disk
    ...: from scipy.signal import convolve2d

In [78]: A = np.arange(1, 17).reshape(4, 4)

In [79]: A
Out[79]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

In [80]: d = disk(1)

In [81]: d
Out[81]: 
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 0]], dtype=uint8)

In [82]: mean(A, d)[1:-1, 1:-1]
Out[82]: 
array([[ 6,  7],
       [10, 11]], dtype=uint8)

In [83]: convolve2d(A, d, mode='valid')/d.sum()
Out[83]: 
array([[ 6.,  7.],
       [10., 11.]])

请注意,在上面的代码中,只考虑有效像素,即选择元素完全包含在图像中的那些像素。