繁体   English   中英

Cimg FFT 显示噪声图像。如何获得正确的 FFT 图像?

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

CImg output 我得到
所需的 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 上运行。 我已经发布了上面的图片。

您的代码中有几处错误:

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

  2. CImg<T>::get_FFT()总是返回一个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 的虚部。 请注意,它与您在 web 上找到的图像的经典傅立叶可视化不对应,它们实际上显示为 FFT 的居中模块(较少使用相位),例如

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM