scipy.ndimage.median_filter偶数尺寸的工作原理探究
scipy.ndimage.median_filter 偶数尺寸的工作机制
核心规则
scipy.ndimage.median_filter 处理偶数尺寸窗口时,遵循两个关键逻辑:
- 窗口范围与锚点:默认以输出位置为窗口的右下角,各维度上窗口覆盖从
当前索引 - (size-1)到当前索引的区域,超出数组边界的部分按指定mode填充(如示例中constant模式用cval=0补0)。 - 偶数元素的中位数选取:当窗口内元素总数为偶数时,取排序后数组的第
n//2个元素(0-based 索引),即上中位数(例如4个元素时取排序后的第3个元素,1-based计数)。
2D 示例验证
以你提供的测试数组为例:
arr = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
当size=2时,针对原数组右下角的9(索引(2,2)):
- 窗口覆盖元素:
(1,1)=5、(1,2)=6、(2,1)=8、(2,2)=9 - 排序后数组:
[5,6,8,9] - 取0-based索引
4//2=2对应的元素8,与输出结果完全匹配。
再验证左上角的(0,0)位置:
- 窗口覆盖元素:边界填充的3个0 + 原数组的
1 - 排序后数组:
[0,0,0,1] - 取索引2对应的元素
0,与输出一致。
1D 示例的“巧合”原因
你观察到1维下偶数尺寸与对应奇数尺寸结果一致,是递增数组特性+中位数规则共同作用的巧合:
size=2时,每个输出位置的窗口包含当前元素与前一个元素,排序后取索引1(2//2=1)的元素(即较大的那个),恰好等于当前元素,因此输出与size=1的结果一致。size=4时,窗口包含前3个元素与当前元素(边界补0),对于递增数组,排序后取索引2(4//2=2)的元素,恰好和size=3时取中间元素的结果重合。
实际使用的表现
偶数尺寸的median_filter能有效模糊图像且难以察觉偏移,是因为窗口的右下角锚点带来的微小偏移在视觉上不明显,同时中位数滤波的固有特性保证了降噪、模糊效果的稳定性。
内容的提问来源于stack exchange,提问作者Mariia Tkachenko
相关产品推荐
相关产品推荐

