2017-03-08 90 views
1

我剛測試過比較OpenCV和fft2在dft函數中的速度。我加載相同的圖像,使用fft2()和dft()進行轉換並測量它們消耗的時間。我發現對於圖像來說,dft()在win32發佈版本中花費了2秒多,而fft2()只花了0.2秒。怎麼來的?我使用的OpenCV版本是2.4.8,而Matlab版本是2013a。這裏是我的測試代碼爲什麼Matlab fft2比OpenCV dft快得多

Matlab的:

tic 
X1 = fft2(im); 
toc 

OpenCV的在C++:

start1 = clock(); 
dft(src,src,DFT_COMPLEX_OUTPUT); 
end1 = clock(); 
cout<<(double)(end1 - start1)/CLOCKS_PER_SEC<<endl; 
+1

MATLAB爲線性代數,功能分析和其他常用函數和算法使用高度優化的專有實現。答案只是MATLAB的實現更好。 – buzjwa

+1

我同意你的看法,但是你能否添加一些你知道的實現細節?無論如何,謝謝你,它真的改變了我對Matlab的印象,它是一種慢腳本語言。 –

+2

我不在MathWorks工作,所以我沒有內部信息與你分享:) – buzjwa

回答

1

我已經問了很長時間的這個問題和類似的問題fft vs dftMatlab vs c++。我找到的答案是,

  1. Matlab有一些內置軟件,如MKL,Lapack和BLAS。
  2. 他們在場景後面使用c或Fortran庫。
  3. 他們使用最好的實現。例如,Matlab中的fft2是基於FFTW的。 (在西方最快的傅里葉變換)
  4. 他們一直在改進。對於某些功能,新版本比舊版本明顯更快。

在另一方面,

  1. 您沒有使用最新版本的OpenCV應該對性能有一些影響。
  2. 您沒有按照建議使用DFT,可以通過獲取optimal dimensions來提高速度。如果圖像尺寸不是最佳的,則可能會顯着增加運行時間。

最後注意:建議不要使用tic, toc,而應使用timeit

1

一般FFT是一種快速實現的DFT。

DFT是一個線性變換,它將長度爲N的覆信號x作爲輸入,並給出長度爲N,X = Wx的覆信號X作爲輸出。 W是一個複雜的NxN矩陣與entiries W_k中,n = EXP(-2pi ķ N/N),其中0 < K,N < N.

FFT是算法的快速計算的集合DFT。通常,FFT所需的操作數量大約爲N * logN。最着名的FFT算法是針對N是2的冪的情況,但是對於主階和其他不同分解有FFT。

+0

那麼,你的意思是函數dft()不是由FFT或類似算法實現的? –

+0

[來自openCV文檔](http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_transforms/py_fourier_transform/py_fourier_transform.html):一種稱爲快速傅立葉變換(FFT)的快速算法用於計算的DFT。 –

+1

嗯,我知道,但在我印象中,所有的DFT都是通過FFT算法實現的,否則使用起來會太慢,不是嗎?所以,我認爲OpenCV中的dft()函數也是通過FFT實現的,它無法解釋爲什麼Matlab中的fft2()函數比OpenCV中的dft()快得多。 –