2017-03-16 144 views
1

對於一個小背景,我使用一堆複數值過濾器進行大量圖像過濾。 我分別生成過濾器的實部和虛部(其效率更高),並將它們存儲在兩個獨立的數組中。在OpenCV中,有沒有什麼辦法比cv :: merge和cv :: split更有效地組合/分離圖像通道?

我跟着this guide關於如何在opencv中做dft的。

基本上,我通過我的過濾器必須

  1. 通話合併到實部和虛部
  2. 合併執行DFT
  3. 呼籲拆分再度分開實部和虛
  4. 計算響應的大小

我這樣做,它相當慢。我最初認爲我需要一個更快的FFT庫,但是基於Visual Studio的分析器,事實證明cv :: split()和cv :: merge()比實際的DFT所花費的時間多一個數量級。實際上,大部分運行時間都用在了這兩個函數中。

整個拆分/合併的事情對我來說似乎有點多餘,事實上,他們是最耗時的功能是非常煩人的。有沒有更快的方法來做我想做的事情?

回答

1

OpenCV矩陣以交錯格式存儲。這意味着對於具有通道A和通道B的雙通道圖像,將以ABABABAB的順序存儲4x1矩陣。如果您有兩個不同的飛機,您有AAAABBBB

說服DFT操作非交叉輸入可能是最難的。但是,也許您可​​以將濾波器作爲雙通道矩陣存儲在第一位?

要計算兩個通道的大小,您可以遍歷所有元素並對它們調用cv :: norm或自己進行計算。您可以通過使用SSE和/或TBB進一步加速。

所以至少你保存了一個轉換。

+0

感謝您的建議。 就過濾器作爲一個雙通道矩陣開始,我遇到的主要障礙是我需要進行復雜的單元乘法運算來應用濾波器。 一旦你合併,OpenCV沒有任何數字的概念是複雜的,它被視爲只是一個2通道圖像。所以我不得不將它們分開以高效地執行乘法。 – user3765410

+0

那麼你也可以通過使用'cv :: Complex'類型的矩陣去完全不同的路線,你可以直接將它們的數據輸入到libfftw的dct方法中,作爲'fftw_complex'輸出。 – ypnos

相關問題