我正在努力研究应用于图像的FFTW。
我可以对图像进行傅立叶变换和逆傅立叶变换,我确信这两个函数都有效。现在我试图分析傅里叶变换的结果并尝试对其应用滤波器等。
目前我对FT结果感到困惑。据我所知,零频率应位于左上角。如果我想检查频率友好,我应该将它转移到图像中心。我测试过至少有两种方法。在FFTW FAQ网页上描述了一种方法,在傅立叶变换之前,图像中的所有像素都乘以(-1)^(i + j),其中i和j是像素的索引。
图像乘以(-1)^(i+j)
,然后其幅度为
但实际上,它应该是这样的(我在imagej中做过)在imagej中的傅里叶变换:
我还尝试使用我的代码在计算其大小后切换它们,但得到了类似的错误结果。
void ftShift2D(double * d, int w, int h)
{
int nw = w/2;
int nh = h/2;
if ( w%2 != 0) {nw++;}
if ( h%2 != 0) {nh++;}
printf("%d, %d\n", nw, nh);
for (int i = 0; i < nh ; i++)
{
for(int j = 0; j < nw; j++)
{
int t1 = i * w + j;
int t2 = (i + nh + 1) * w + j + nw;
swapXY<double>(d[t1], d[t2]);
}
for (int k = nw; k < w; k++)
{
int t1 = i * w + k;
int t2 = (i + nh + 1 ) * w + k - nw;
swapXY<double>(d[t1], d[t2]);
}
}
}
我理解FTW的布局结果,如他们的网站所述。 我也检查了输出,这个布局可以确认,只有上半部分有数据,其余的都是0.因此,似乎可以解释为什么上面使用的两种方法都行不通。我正在尝试设计将零频率转换到图像中心的新方法。你能给我一个更好的办法吗?
我坚持这个,目的是使用过滤器,这将更容易理解。如果零频率没有转移到中心,你能不能给我另一个建议,例如,我可以在频域上对它应用高斯滤波器。
非常感谢。
输入图像是:
FT和IFT代码是
void Imgr2c(double * d, fftw_complex * df, int w, int h)
{
fftw_plan p = fftw_plan_dft_r2c_2d(h, w, d, df, FFTW_ESTIMATE);
fftw_execute(p);
fftw_destroy_plan(p);
}
void Imgc2r(fftw_complex * in, double * ftReverse, int w, int h)
{
fftw_plan p = fftw_plan_dft_c2r_2d(h, w, in, ftReverse, FFTW_ESTIMATE);
fftw_execute(p);
int l = w * h;
for (int i = 0; i < l; i++)
{
ftReverse[i] /= l;
}
fftw_destroy_plan(p);
}
[Spektre编辑]
这应该是或多或少的样子:
答案 0 :(得分:0)
您可能想看看我是如何做到的: https://github.com/kvahed/codeare/blob/master/src/matrix/ft/DFT.hpp 完成工作的职能在底部。如果有任何问题,请随时与我联系。
答案 1 :(得分:0)
我发现了我的问题!我不深入了解FFTW中DFT的输出布局。经过一些测试,我发现宽度尺寸应为2 + 1,高度尺寸没有变化。做FT,IFT和移动原点的代码没有问题。我需要做的是在尝试访问时更改维度。
magnitude after shifting the origin 干杯,
药王庙