4

我有一个二进制数组,比如说a = np.random.binomial(n=1, p=1/2, size=(9, 9)). 我使用3 x 3内核对其执行中值过滤,例如b = nd.median_filter(a, 3). 我希望这应该基于像素及其八个邻居执行中值滤波。但是,我不确定内核的位置。文件说,

原点:标量,可选。

The origin parameter controls the placement of the filter. Default 0.0.

如果默认值为零,则应该将当前像素和3 x 3网格放在右侧和底部,不是吗?默认值不应该是中心footprint吗?在我们的3 x 3示例中,哪个对应(1, 1)(0, 0)

谢谢。

4

1 回答 1

3

origin 说它只接受一个标量,但对我来说它也接受类似数组的输入,scipy.ndimage.filters.convolve函数也是如此。通过 0 确实是足迹的中心。Origin 的值是相对于中心的。对于 3x3 封装,您可以指定值 -1.0 到 1.0。这里有些例子。请注意,在未指定原点的示例中,过滤器按预期居中。

import numpy as np
import scipy.ndimage

a= np.zeros((5, 5))
a[1:4, 1:4] = np.arange(3*3).reshape((3, 3))

default_out = scipy.ndimage.median_filter(a, size=(3, 3))
shift_pos_x = scipy.ndimage.median_filter(a, size=(3, 3), origin=(0, 1))
shift_neg_x = scipy.ndimage.median_filter(a, size=(3, 3), origin=(0, -1))

print(a)
print(default_out)
print(shift_pos_x)
print(shift_neg_x)

输出:

输入数组:

[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  1.  2.  0.]
 [ 0.  3.  4.  5.  0.]
 [ 0.  6.  7.  8.  0.]
 [ 0.  0.  0.  0.  0.]]

居中输出:

[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  1.  4.  2.  0.]
 [ 0.  0.  4.  0.  0.]
 [ 0.  0.  0.  0.  0.]]

右移输出:

[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  1.  4.  2.]
 [ 0.  0.  0.  4.  0.]
 [ 0.  0.  0.  0.  0.]]

移到左输出:

[[ 0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 1.  4.  2.  0.  0.]
 [ 0.  4.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]
于 2016-02-08T06:40:23.080 回答