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.]])
请注意,在上面的代码中,只考虑有效像素,即选择元素完全包含在图像中的那些像素。
我有以下代码:
结果中的中心条目(在索引 [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.]])
请注意,在上面的代码中,只考虑有效像素,即选择元素完全包含在图像中的那些像素。