最快的高斯模糊实现

Sid*_*tta 33 java filtering image-processing gaussian

你如何实现最快的高斯模糊算法?

我将用Java实现它,因此排除了GPU解决方案.我的应用程序planetGenesis是跨平台的,所以我不想要JNI.

Dim*_*ima 27

您应该使用高斯内核可分离的事实,即您可以将2D卷积表示为两个1D卷积的组合.

如果滤波器很大,则使用空间域中的卷积等效于频率(傅立叶)域中的乘法的事实也是有意义的.这意味着您可以对图像和滤波器进行傅里叶变换,将(复数)结果相乘,然后进行逆傅立叶变换.FFT(快速傅里叶变换)的复杂度是O(n log n),而卷积的复杂度是O(n ^ 2).此外,如果您需要使用相同的滤镜模糊许多图像,则只需要对滤镜进行一次FFT.

如果您决定使用FFT,则FFTW库是一个不错的选择.

  • 还要注意,高斯函数集在傅立叶变换下是闭合的 - 采用一个高斯的傅里叶变换将只给出不同的高斯函数. (4认同)

Dar*_*enW 21

数学运动员很可能知道这一点,但对其他人来说......

由于高斯的良好数学特性,您可以通过首先在图像的每一行上运行一维高斯模糊来快速模糊二维图像,然后在每列上运行一维模糊.

  • 感谢您翻译"您应该使用高斯内核可分离的事实,即您可以将2D卷积表示为两个1D卷积的组合." ([迪马](http://stackoverflow.com/a/102292/1048186)) (7认同)
  • @JosiahYoder 如果您没有注意到,这个答案是在这个答案被认为是“翻译”的答案之前 12 小时发布的。 (2认同)

Sid*_*tta 17

  1. 我找到了Quasimondo:孵化器:加工:快速高斯模糊.此方法包含许多近似值,例如使用整数和查找表而不是浮点数和浮点除法.我不知道现代Java代码有多快.

  2. 矩形上的快速阴影具有使用 B样条的近似算法.

  3. C#中的快速高斯模糊算法声称有一些很酷的优化.

  4. 此外,David Everly的快速高斯模糊(PDF)具有用于高斯模糊处理的快速方法.

我会尝试各种方法,对它们进行基准测试并在此处发布结果.

为了我的目的,我已经从互联网上复制并实现了基本(处理XY轴独立)方法和David Everly的快速高斯模糊方法.它们的参数不同,所以我无法直接比较它们.然而,对于大的模糊半径,后者经历的迭代次数要少得多.而且,后者是近似算法.


Iva*_*kir 14

终极解决方案

我对这么多信息和实现感到非常困惑,我不知道应该相信哪一个.在我弄明白之后,我决定写自己的文章.我希望它可以节省你几个小时的时间.

最快的高斯模糊(线性时间)

它包含源代码,(我希望)简短,干净,可以轻松地重写为任何其他语言.请投票,以便其他人可以看到它.

  • 我制作了您代码的 RGBA 版本,以便与 StackBlur 比较速度和质量。这是代码:http://pastebin.com/mS0fNYFF - 但我必须说,StackBlur 仍然更快,它以更好的方式处理边界条件(不确定是否有遗漏,但我看到你的代码) (2认同)

Ste*_*nov 8

你可能想要盒子模糊,这要快得多.请参阅此链接以获取精彩教程以及一些复制和粘贴C代码.


Tom*_*das 7

对于较大的模糊半径,尝试应用三次框模糊.这将非常接近高斯模糊,并且比真正的高斯模糊快得多.

  • 基本上.如果你想要一个20的"模糊直径",应用一个直径为7,7,然后为6的盒子模糊.这样会产生类似于直径为20的单个盒子模糊的模糊,但看起来更好看. (2认同)