Cimg FFt 显示噪声 image.How 以获得正确的 FFT 图像?

Cimg FFt is showing noise image.How to get the proper FFT Image?

CImg output i am getting
Desired FFT ouptut.Checked using ImageJ

#include "CImg.h"
using namespace cimg_library;

int main(int argc, char * argv[]) {

    const char * input_file = "Lenna.png";

    CImg<unsigned char> * input = new CImg<unsigned char>(input_file);

    //resize_fft(*input); //Resize the image for the FFT
    //CImg<unsigned char> gray = any2gray(*input); //to single-channel grayscale image
    //free(input);


    CImgList<unsigned char> fft = input->get_FFT();
    CImg<unsigned char>::FFT(fft[0], fft[1], false);
    fft[0].save("fft.jpg");

    return 1;
}

我试过这段代码。但是我收到噪音 image.Anybody 可以帮助我获得所需的 fft 图像吗?我 运行 Linux。我已经发布了上面的图片。

您的代码中有几处错误:

  1. 根据(数学)定义,FFT 的结果是浮点值图像。您无法将 FFT 图像准确地存储到 CImgList<unsigned char> 中。在定义 fft 变量时,请改用 CImgList<float>CImgList<double>。 您当前的 fft 定义为 CImgList<unsigned char>,CImg 无法在其中存储浮点值。

  2. CImg<T>::get_FFT()总是returns一个CImgList<float>或一个CImgList<double>,取决于原始类型T(如果Tunsigned char,结果可能是 CImgList<float>)。但是如果你写

CImgList<unsigned char> fft = input->get_FFT();

那么,当然get_FFT()的结果四舍五入为unsigned char,这不是你想要的

所以,正确的代码是:

 CImg<unsigned char> input(input_file); // (note: No need for a pointer here).
 CImgList<float> fft = input.get_FFT();

此时fft[0]为FFT的实部,fft[1]为FFT的虚部。请注意,它与您在网络上找到的图像的经典傅立叶可视化不对应,这些图像实际上显示为 FFT 的居中 module(较少有相位),例如

https://cs.appstate.edu/ret/imageJ/PClabs/imlab/FFT/gif/imj-fft1.gif

得到这个需要额外的步骤来转换你得到的复值 FFT 作为这个标量图像表示(这实际上只适用于可视化,而不适用于傅立叶 space 中的实际计算,因为你失去了一半FFT 的数据)。

哦,在说您使用的任何库缺乏设计之前,问问自己是否有某些东西可能 不理解。看着你的代码让我觉得你在对如何设计一个编程库有相关的意见之前还有很多东西要学。