You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

skimage.filters.rank.mean返回结果不符预期,中心像素计算存疑

问题解析:为什么mean(A, disk(1))的中心值和你的预期不符?

你的困惑主要来自两个关键误解:

1. disk(1)不是3x3全像素的结构元素

你误以为disk(1)是覆盖3x3所有9个像素的核,但实际上skimage.morphology.disk()生成的是圆形结构元素,只包含欧几里得距离≤半径的像素。对于半径1来说,只有中心像素和它的上下左右四个相邻像素满足距离条件,实际输出是:

[[False  True False]
 [ True  True  True]
 [False  True False]]

只有这5个True标记的位置,才是均值计算时会用到的有效像素。

2. rank.mean是形态学局部均值,不是你理解的卷积操作

skimage.filters.rank.mean的逻辑是:对每个像素,取其周围被结构元素覆盖的所有像素的平均值(如果结构元素是二进制的,就是这些像素的总和除以结构元素中有效像素的数量),而非传统卷积的“核与像素相乘再求和”(当然如果核是归一化的全1矩阵,结果会类似,但这里结构元素的形状根本不是全1)。

具体计算验证

你的输入数组A是:

[[1,2,3],
 [4,5,6],
 [7,8,9]]

对于中心像素(1,1),disk(1)覆盖的有效像素是:

  • 上方:A[0,1] = 2
  • 左方:A[1,0] = 4
  • 中心:A[1,1] = 5
  • 右方:A[1,2] = 6
  • 下方:A[2,1] = 8

这些值的总和是2+4+5+6+8 = 25,除以有效像素数量5,得到25/5 = 5,这就是你代码输出中中心位置的结果。

如何得到你预期的结果?

如果你确实想计算3x3所有像素的均值(也就是用全1的3x3核做归一化卷积),有两种方式:

  • 用square(3)代替disk(1),因为square(3)是3x3全True的结构元素:
    from skimage.morphology import square
    print("mean: {}".format(mean(A, square(3))))
    
    此时中心值就是(1+2+3+4+5+6+7+8+9)/9 = 5。
  • 用传统卷积函数skimage.filters.convolve:
    from skimage.filters import convolve
    kernel = np.ones((3,3)) / 9
    result = convolve(A, kernel)
    print("convolve result: {}".format(result))
    
    输出的中心值同样是5(因为所有9个像素的平均值是5)。

内容的提问来源于stack exchange,提问作者That Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:40:50