C++ 使用快速傅里叶变换模糊矩阵

C++ 使用快速傅里叶变换模糊矩阵,c++,wolfram-mathematica,gaussian,convolution,fftw,C++,Wolfram Mathematica,Gaussian,Convolution,Fftw,我想模糊矩阵中的值,这样在相邻元素中我们就不会有尖锐的变换 在维基百科页面上,我找到了一些关于高斯模糊的信息。我用最简单的算法进行了尝试,因此运行时间太长。坦白地说,我不确定我的实现是否正确,因为在边界瓷砖上仍然存在尖锐的过渡 我注意到,这种模糊可以用离散傅里叶变换来实现,它的速度要快得多,但我无法理解 因此,我们可以用下面的公式得到模糊矩阵: blurredMatrix = IFFT[FFT[initialMatrix]FFT[weightingFunction]] blurredMatri

我想模糊矩阵中的值,这样在相邻元素中我们就不会有尖锐的变换

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

我注意到,这种模糊可以用离散傅里叶变换来实现,它的速度要快得多,但我无法理解

因此,我们可以用下面的公式得到模糊矩阵:

blurredMatrix = IFFT[FFT[initialMatrix]FFT[weightingFunction]]
blurredMatrix = Chop[FourierDCT[(FourierDCT[G]) (FourierDCT[initialMatrix]), 3], 10^-6]
其中FFT/IFFT为快速傅里叶变换/快速傅里叶逆变换

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

我用高斯矩阵作为加权函数

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

blurredMatrix = Chop[FourierDCT[(FourierDCT[G]) (FourierDCT[initialMatrix]), 3], 10^-6]
假设我们的初始矩阵有nxn个大小,其中n=2k+1

G = Chop[GaussianMatrix[k] GaussianMatrix[k], 10^6]
然后,我尝试创建blurredMatrix,如下所示:

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/>
f[xi,yj]:=1/(2\[Pi]\[Sigma]^2)Exp[-((xi^2)+(yj^2))/(2\[Sigma]^2])
[西格玛]=3
G=Chop[N[表[f[i,j],{i,1100},{j,1100}]]
Tavg=Chop[1000逆前导[(Fourier[G])(Fourier[T])],10^-6]
使用这种方法,图像看起来很好(图像模糊),但blurredMatrix和initialMatrix的值之间存在很大差异

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

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


请告诉我这是否是一种错误的模糊方法,还有其他可能实现我想要的功能。

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

有许多实现可以进行小型内核卷积。
大多数现代硬件都支持这种内在操作(MMX、SSE、GPU…。
在您的情况下,FFT可能不是一种可行的方法


C++中支持跨平台和硬件加速的图像卷积。卷积实际上是任何图像和信号处理软件包中最基本的操作之一(如果不是的话)

使用FFT进行卷积只有在卷积核非常大的情况下才有效。在大多数模糊应用程序中,内核比图像小得多,因此FFT速度会明显减慢。你想要的模糊内核的大小是多少?@AdiShavit,我使用的是3x3内核,但是内核的大小是由环境变量控制的。我在互联网上找到了一些文章,使高斯模糊速度更快,但我不确定这是否是正确的方法。另外,我需要在大量的矩阵上应用模糊。如果你可以使用图形卡,你可以用CUDA在上面进行卷积。事实证明,图形卡在进行大型矩阵计算时非常有效。尝试编辑以前的,但速度太慢。我找到了关于这个概念的教程。找到了一个关于这个概念的教程:正如这些人所说,nVidia也建议不要使用FFT方法来处理这个内核大小。你能分享一些实现的链接吗?我添加了一个到OpenCV的链接,但是在不了解你的平台和环境的情况下,很难给出具体的东西。我敢肯定,对于大多数平台,网络搜索将产生几十种选择。