11

我正在 labview 中创建 2D DCT-II,但希望能够检查我的输出是否正确。SciPy 有一个很好的 DCT 函数,默认为 DCT-II,但它是一维的。

我想让它适用于二维数组。为此,必须将 DCT 应用于列,然后必须再次将 DCT 应用于此结果的行。

我不确定我想使用什么功能来做到这一点。我试过 np.rot90 将 numpy 数组逆时针旋转 90 度,如下所示:

import numpy as np
from scipy.fftpack import dct

a = np.array([[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]])

b = dct(np.rot90(dct(a),3))

但是,这会输出以下内容:

array([[ 1152.        ,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [ -412.30867345,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [    0.        ,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [  -43.10110726,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [    0.        ,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [  -12.85778584,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [    0.        ,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ],
       [   -3.24494866,     0.        ,     0.        ,     0.        ,
            0.        ,     0.        ,     0.        ,     0.        ]])

我认为 rot90 不是做我想做的事情的正确功能,也许有更好的功能?

4

3 回答 3

33

@Jaime 的回答很好。我要补充一点,dct就是axis为了这个目的。首先沿轴 0 应用它,然后沿结果的轴 1 应用它:

In [30]: from scipy.fftpack import dct

In [31]: a.shape
Out[31]: (8, 8)

In [32]: t1 = dct(dct(a, axis=0), axis=1)

In [33]: t2 = dct(dct(a.T).T)

In [34]: np.abs(t1 - t2).max()
Out[34]: 0.0
于 2013-04-13T03:42:50.707 回答
16

我不认为旋转是您想要的,因为它将行转换为列,但它也会混淆数据的顺序。改为使用np.transpose

要先按列应用 dct,然后按行应用,您可以执行以下操作:

dct(dct(a.T).T)

尾随.T相当于np.transpose。请注意在对列进行操作后如何撤消转置,以使返回再次按行对齐。

我不认为你应用 dct 的顺序,即列然后行与行然后列,有任何区别,但你可以得到行然后列:

dct(dct(a).T).T
于 2013-04-12T22:11:19.350 回答
3

现在还有一个多维 DCT 函数(和反函数):

>>> from scipy.fft import dctn, idctn
>>> b = dctn(a)
>>> np.allclose(a, idctn(b))
True

https://docs.scipy.org/doc/scipy/reference/generated/scipy.fft.dctn.html

于 2020-11-21T00:25:26.130 回答