使用快速傅立叶变换模糊矩阵

时间:2015-05-21 13:15:16

标签: c++ wolfram-mathematica gaussian convolution fftw

我想模糊矩阵中的值,以便在相邻元素中我们没有明显的过渡。

从维基百科页面Gaussian Blur我发现了一些关于高斯模糊的信息。我用最简单的算法尝试过它,因此运行时间太长了。坦率地说,我不确定我的实现是否正确,因为在边界瓷砖上仍然存在明显的过渡。

我注意到这种模糊可以通过离散的傅立叶变换来完成,这种变换要快得多,但我无法弄明白。

所以,我们的想法是,我们可以通过以下公式获得模糊矩阵:

blurredMatrix = IFFT[FFT[initialMatrix]FFT[weightingFunction]]

FFT / IFFT是快速傅立叶变换/快速傅里叶逆变换。

目前我正在尝试对Wolfram Mathematica进行一些测试,以确保这种傅立叶变换的近似是正确的。

我使用GaussianMatrix作为权重功能。

我需要2d模糊,所以我创建了如下的高斯矩阵:

假设我们的初始矩阵具有nxn大小,其中n = 2k + 1

G = Chop[GaussianMatrix[k] GaussianMatrix[k], 10^6]

然后,我尝试创建如下的blurMatrix:

blurredMatrix = Chop[FourierDCT[(FourierDCT[G]) (FourierDCT[initialMatrix]), 3], 10^-6]

但是我的结果是零。

似乎我做错了。

另外,我尝试了另一种方法:

f[xi_, yj_] := 1/(2 \[Pi] \[Sigma]^2) Exp[-(((xi^2) + (yj^2) )/(2 \[Sigma]^2))];<br/>
[Sigma] = 3;<br/>
G = Chop[N[Table[f[i, j], {i, 1, 100}, {j, 1, 100}]]]; <br/>
Tavg = Chop[ 1000 InverseFourier[(Fourier[G]) (Fourier[T]) ], 10^-6]; <br/>

使用这种方法,图像看起来很好(图像模糊),但blurMatrix和initialMatrix的值之间存在很大差异。

似乎有一些正常化或其他问题。

我需要用C / C ++编写代码,C中有一个库FFTW库,支持离散傅里叶变换。

如果这是一种错误的模糊方式,请告诉我,还有其他可能做我想做的事。

1 个答案:

答案 0 :(得分:5)

使用FFT进行卷积只有在拥有非常大的卷积内核时才有效。在大多数模糊应用中,内核比图像小得多,例如, 3x3,因此FFT会明显变慢。

有很多实现小内核卷积的实现 大多数现代硬件都支持这种内在操作(MMX,SSE,GPU ......) 在您的情况下,FFT可能不适合。

在C ++中,OpenCV支持跨平台和硬件加速图像卷积。卷积确实是(如果不是)任何图像和信号处理包的最基础操作之一。