我正在尝试为学校项目实施高斯模糊。
我需要同时实现 CPU 和 GPU 来比较性能。
我不太确定我是否理解高斯模糊的工作原理。所以我的问题之一是
如果我理解正确的话?
这就是我现在所做的:
我使用维基百科中的方程http://en.wikipedia.org/wiki/Gaussian_blur http://en.wikipedia.org/wiki/Gaussian_blur计算
过滤器。
对于 2d,我采用图像中每个像素的 RGB 并通过以下方式对其应用滤镜
将像素和周围像素的 RGB 与关联的滤镜位置相乘。
然后将这些值相加得到新的像素 RGB 值。
对于 1d,我首先水平应用过滤器,然后垂直应用过滤器,这应该给出
如果我理解正确的话,结果是一样的。
这个结果与应用 2d 滤波器时的结果完全相同吗?
我的另一个问题是如何优化算法。
我读到快速傅里叶变换适用于高斯模糊。
但我不知道如何将其联系起来。
有人能给我正确方向的提示吗?
Thanks.
是的,二维高斯核是可分离 http://blogs.mathworks.com/steve/2006/10/04/separable-convolution/所以你可以将它作为两个一维内核应用。请注意,您无法“就地”应用这些操作 - 您至少需要一个临时缓冲区来存储第一个一维传递的结果。
当您拥有大内核时,基于 FFT 的卷积是一种有用的优化 - 这适用于任何类型的滤波器,而不仅仅是高斯滤波器。 “大”到底有多大取决于您的架构,但您可能不想担心使用基于 FFT 的方法来处理小于 49x49 内核的任何东西。一般的做法是:
- 对图像进行 FFT
- FFT 内核,填充到图像的大小
- 频域中两者相乘(相当于空间域中的卷积)
- IFFT(逆FFT)结果
请注意,如果您将相同的过滤器应用于多个图像,则只需对填充内核进行 FFT 一次。不过,每个图像仍然至少要执行两次 FFT(一次正向和一次反向),这就是为什么该技术仅成为大型内核的计算优势。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)