2017-03-16 128 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

相关问题