fftw将零频率移至图像中心

时间:2017-09-12 14:05:52

标签: c++ image-processing filter fft fftw

我正在努力研究应用于图像的FFTW。

我可以对图像进行傅立叶变换和逆傅立叶变换,我确信这两个函数都有效。现在我试图分析傅里叶变换的结果并尝试对其应用滤波器等。

目前我对FT结果感到困惑。据我所知,零频率应位于左上角。如果我想检查频率友好,我应该将它转移到图像中心。我测试过至少有两种方法。在FFTW FAQ网页上描述了一种方法,在傅立叶变换之前,图像中的所有像素都乘以(-1)^(i + j),其中i和j是像素的索引。

图像乘以(-1)^(i+j),然后其幅度为

umg

但实际上,它应该是这样的(我在imagej中做过)在imagej中的傅里叶变换:

img

我还尝试使用我的代码在计算其大小后切换它们,但得到了类似的错误结果。

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.因此,似乎可以解释为什么上面使用的两种方法都行不通。我正在尝试设计将零频率转换到图像中心的新方法。你能给我一个更好的办法吗?

我坚持这个,目的是使用过滤器,这将更容易理解。如果零频率没有转移到中心,你能不能给我另一个建议,例如,我可以在频域上对它应用高斯滤波器。

非常感谢。

输入图像是:

img

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编辑]

这应该是或多或少的样子:

img

2 个答案:

答案 0 :(得分:0)

您可能想看看我是如何做到的: https://github.com/kvahed/codeare/blob/master/src/matrix/ft/DFT.hpp 完成工作的职能在底部。如果有任何问题,请随时与我联系。

答案 1 :(得分:0)

我发现了我的问题!我不深入了解FFTW中DFT的输出布局。经过一些测试,我发现宽度尺寸应为2 + 1,高度尺寸没有变化。做FT,IFT和移动原点的代码没有问题。我需要做的是在尝试访问时更改维度。

magnitude after DFT

magnitude after shifting the origin 干杯,

药王庙