Cimg FFt显示噪声图像.如何获得正确的FFT图像



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上运行。我已经发布了上面的图片。

您的代码中有几个错误:

  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的虚部。请注意,它与您在网络上找到的图像的经典傅立叶可视化不一致,这些图像实际上显示为FFT的中心模块(较少与相位一起显示(,例如

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

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

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

最新更新