0

CImg 输出我得到了
所需的 FFT 输出。使用 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;
}

我试过这段代码。但是我得到了噪声图像。任何人都可以帮助我获得所需的 fft 图像吗?我在 Linux 上运行。我已经发布了上面的图片。

4

1 回答 1

0

您的代码中有几处错误:

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

  2. CImg<T>::get_FFT()总是返回 aCImgList<float>或 a CImgList<double>,具体取决于原始类型T(如果Tunsigned char,结果可能是 a 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 的实部, 是 FFTfft[1]的虚部。请注意,它与您在网络上找到的图像的经典傅立叶可视化不对应,这些图像实际上显示为 FFT 的居中模块(较少使用相位),例如

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

实现这一点需要额外的步骤来将您获得的复值 FFT 转换为这种标量图像表示(这实际上仅适用于可视化,而不适用于傅里叶空间中的实际计算,因为您丢失了 FFT 的一半数据)。

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

于 2021-03-20T08:02:50.027 回答