如果我想在 OpenCV 中执行图像与内核的卷积,我可以使用 filter2D
函数。另一种选择是使用 for 循环创建我自己的过滤器,如 this post .
filter2D 会比帖子中提供的代码更快吗?如果是,是什么让它更快?
我试着查看 code for filter2d但无法理解。我是 openCV 的新手,非常感谢这方面的任何帮助。
最佳答案
事实上,大多数 OpenCV 都比原始方法快得多!对于卷积,他们通常使用以下两种基本优化之一:
可分离卷积。利用某些类型内核的“卷积的关联属性”。对于
M-by-N
图像和P-by-Q
内核,朴素的方法是M*N*P*Q
。如果内核是可分离的,您可以在M*N(P+Q)
中进行。那是巨大的!您会注意到 OpenCV 的 filter2d 源在可能的情况下利用了这一点。了解更多信息 here .卷积定理。这种优化更好,但有点复杂。基本上:空间域中的卷积等效于频域中的逐点乘法。这意味着如果您将图像和内核通过 FFT,您的卷积可以从二次(朴素)时间开始复杂度为 O(n log n)!查看Convolution theorem on Wikipedia
关于c++ - OpenCV:filter2D函数的计算效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31336186/