【问题标题】:skimage mean is not returning expected result?skimage 的意思是没有返回预期的结果?
【发布时间】:2020-11-29 09:49:19
【问题描述】:

我有以下代码:

结果中的中心条目(在索引 [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。为什么这不是真的?

【问题讨论】:

    标签: python scikit-image


    【解决方案1】:

    skimage.filters.rank.mean 计算选择元素中值为 1 的像素的平均值,而不是整个窗口的平均值。如果传入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.]])
    

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

    【讨论】:

    • 你不知道我是多么感激这一点。祝你有美好的一天!
    猜你喜欢
    • 2016-06-28
    • 2015-09-16
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多