c++ - OpenCV:filter2D函数的计算效率

标签 c++ opencv image-processing

如果我想在 OpenCV 中执行图像与内核的卷积,我可以使用 filter2D 函数。另一种选择是使用 for 循环创建我自己的过滤器,如 this post .

filter2D 会比帖子中提供的代码更快吗?如果是,是什么让它更快?

我试着查看 code for filter2d但无法理解。我是 openCV 的新手,非常感谢这方面的任何帮助。

最佳答案

事实上,大多数 OpenCV 都比原始方法快得多!对于卷积,他们通常使用以下两种基本优化之一:

  1. 可分离卷积。利用某些类型内核的“卷积的关联属性”。对于M-by-N 图像和P-by-Q 内核,朴素的方法是M*N*P*Q。如果内核是可分离的,您可以在 M*N(P+Q) 中进行。那是巨大的!您会注意到 OpenCV 的 filter2d 源在可能的情况下利用了这一点。了解更多信息 here .

  2. 卷积定理。这种优化更好,但有点复杂。基本上:空间域中的卷积等效于频域中的逐点乘法。这意味着如果您将图像和内核通过 FFT,您的卷积可以从二次(朴素)时间开始复杂度为 O(n log n)!查看Convolution theorem on Wikipedia

关于c++ - OpenCV:filter2D函数的计算效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31336186/

相关文章:

c++ - C++ 和 Matlab 互相关

image-processing - 外发光作为 HLSL 着色器

python - 如何在Python中使用opencv绘制轮廓?

c++ - 使用 QRegularExpression 将嵌套的捕获组与量词匹配

带空格的 C++ 输入字符串

c++ - 如何声明这个算法?

opencv - 垫到IplImage崩溃

java - 将 List<KeyPoint> 转换为 MatofKeypoints

c++ - 使用 Ffmpeg 构建和使用 OpenCV 作为静态库

java - 如何在 Java 或 clojure 中使用 ImageJ 进行批量图像处理?