2013-04-12 14 views
8

Tôi đang tạo 2D DCT-II trong labview nhưng muốn có thể kiểm tra đầu ra của tôi là chính xác. SciPy có chức năng DCT đẹp mặc định là DCT-II nhưng là 1D.Sử dụng chức năng DCT SciPy để tạo 2D DCT-II

Tôi muốn làm cho nó hoạt động cho một mảng 2D. Để làm điều này, DCT phải được áp dụng cho các cột và sau đó DCT phải được áp dụng lại cho các hàng của kết quả này.

Tôi không chắc chắn chức năng nào tôi muốn sử dụng để thực hiện việc này. Tôi đã cố gắng np.rot90 mà quay mảng NumPy 90 độ chống chiều kim đồng hồ như sau:

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)) 

Tuy nhiên này kết quả đầu ra như sau:

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.  ]]) 

Tôi nghĩ rằng rot90 không phải là chức năng quyền làm những gì Tôi muốn làm, có lẽ có một cái tốt hơn?

Trả lời

14

Tôi không nghĩ rằng một vòng quay là những gì bạn muốn, vì nó chuyển đổi hàng thành cột, nhưng nó cũng lộn xộn với thứ tự của dữ liệu. Sử dụng np.transpose để thay thế.

Để áp dụng DCT đầu tiên của cột, sau đó bởi hàng, bạn sẽ làm điều gì đó như:

dct(dct(a.T).T) 

Các trailing .T tương đương với np.transpose. Lưu ý cách bạn cần hoàn tác chuyển vị sau khi bạn hoạt động trên các cột, để trả lại hàng được căn chỉnh lại.

Tôi không nghĩ rằng thứ tự mà bạn áp dụng DCT, tức là cột sau đó hàng so với hàng sau đó cột, làm cho bất kỳ sự khác biệt, nhưng bạn có thể nhận được hàng sau đó cột như:

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

@ Câu trả lời của Jaime là tốt. Tôi sẽ thêm rằng dct có một đối số axis chỉ cho mục đích này. Trước tiên, áp dụng nó dọc theo, nói, trục 0, sau đó dọc theo trục 1 của kết quả:

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 
Các vấn đề liên quan