2013-04-12 29 views
8

我在labview中創建了2D DCT-II,但希望能夠檢查我的輸出是否正確。 SciPy有一個很好的DCT功能,默認爲DCT-II,但是是1D。使用SciPy DCT函數創建2D 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是不是做正確的函數我想要做,也許有更好的?

回答

14

我不認爲輪換是你想要的,因爲它將行轉換爲列,但它也隨着數據的順序而混亂。改爲使用np.transpose

要通過列的第一應用DCT,然後通過行,你會做這樣的事情:

dct(dct(a.T).T) 

尾隨.T相當於np.transpose。注意如何在對列進行操作後需要撤消換位,以便再次按行重新對齊返回。

我不認爲在您應用DCT的順序,即列然後行與行則列,有什麼差別,但你可以得到行則列如下:

dct(dct(a).T).T 
21

@ Jaime的回答很好。我會補充一點,dct有一個axis只是爲了這個目的。首先沿着軸線0應用它,例如軸線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