你如何实现最快的高斯模糊算法?
我将用Java实现它,因此排除了GPU解决方案.我的应用程序planetGenesis是跨平台的,所以我不想要JNI.
您应该使用高斯内核可分离的事实,即您可以将2D卷积表示为两个1D卷积的组合.
如果滤波器很大,则使用空间域中的卷积等效于频率(傅立叶)域中的乘法的事实也是有意义的.这意味着您可以对图像和滤波器进行傅里叶变换,将(复数)结果相乘,然后进行逆傅立叶变换.FFT(快速傅里叶变换)的复杂度是O(n log n),而卷积的复杂度是O(n ^ 2).此外,如果您需要使用相同的滤镜模糊许多图像,则只需要对滤镜进行一次FFT.
如果您决定使用FFT,则FFTW库是一个不错的选择.
数学运动员很可能知道这一点,但对其他人来说......
由于高斯的良好数学特性,您可以通过首先在图像的每一行上运行一维高斯模糊来快速模糊二维图像,然后在每列上运行一维模糊.
我找到了Quasimondo:孵化器:加工:快速高斯模糊.此方法包含许多近似值,例如使用整数和查找表而不是浮点数和浮点除法.我不知道现代Java代码有多快.
矩形上的快速阴影具有使用 B样条的近似算法.
C#中的快速高斯模糊算法声称有一些很酷的优化.
此外,David Everly的快速高斯模糊(PDF)具有用于高斯模糊处理的快速方法.
我会尝试各种方法,对它们进行基准测试并在此处发布结果.
为了我的目的,我已经从互联网上复制并实现了基本(处理XY轴独立)方法和David Everly的快速高斯模糊方法.它们的参数不同,所以我无法直接比较它们.然而,对于大的模糊半径,后者经历的迭代次数要少得多.而且,后者是近似算法.
终极解决方案
我对这么多信息和实现感到非常困惑,我不知道应该相信哪一个.在我弄明白之后,我决定写自己的文章.我希望它可以节省你几个小时的时间.
最快的高斯模糊(线性时间)
它包含源代码,(我希望)简短,干净,可以轻松地重写为任何其他语言.请投票,以便其他人可以看到它.
你可能想要盒子模糊,这要快得多.请参阅此链接以获取精彩教程以及一些复制和粘贴C代码.
对于较大的模糊半径,尝试应用三次框模糊.这将非常接近高斯模糊,并且比真正的高斯模糊快得多.