使用每个组件上的medilt过滤3D信号会产生与一次过滤信号不同的结果

时间:2017-04-09 09:09:40

标签: python numpy scipy

我使用medfilt过滤三维数组(a,b,c)

std::shared_ptr<T[]>

如果我像这样分开过滤3个组件

        import scipy as sp
        import numpy as np
        a = np.random.rand(180000)
        b = np.random.rand(180000)
        c = np.random.rand(180000)

然后将它们组合成一个numpy数组

        x = sp.signal.medfilt(a,3)
        y = sp.signal.medfilt(b, 3)
        z = sp.signal.medfilt(c, 3)

我得到的结果与我同时过滤3个组件的结果不同......

        out1 = np.array([x,y,z]).T     

你能解释一下为什么吗?

1 个答案:

答案 0 :(得分:0)

对于2D堆叠数组,我们需要使用2D version of median filter,以及每个维度的内核大小列表。

因此,我们会 -

from scipy.signal import medfilt2d

out2 = medfilt2d(sigIn,[3,1])

示例运行 -

In [49]: n = 4
    ...: a = np.random.rand(n)
    ...: b = np.random.rand(n)
    ...: c = np.random.rand(n)
    ...: 
    ...: x = medfilt(a,3)
    ...: y = medfilt(b, 3)
    ...: z = medfilt(c, 3)
    ...: 
    ...: out1 = np.array([x,y,z]).T
    ...: 

In [53]: from scipy.signal import medfilt2d

In [54]: sigIn = np.array([a,b,c]).T

In [55]: out2 = medfilt2d(sigIn,[3,1])

In [56]: np.allclose(out1, out2)
Out[56]: True

作为旁注,我们可以使用np.column_stack进行堆叠操作,从而避免使用transpose,如此 -

sigIn = np.column_stack((a,b,c))