[英]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 上运行。 我已经发布了上面的图片。
您的代码中有几处错误:
根据(数学)定义,FFT 的结果是浮点值图像。 您无法将 FFT 图像准确存储到CImgList<unsigned char>
中。 定义fft
变量时,请改用CImgList<float>
或CImgList<double>
。 您当前的fft
被定义为CImgList<unsigned char>
,CImg 无法在其中存储浮点值。
CImg<T>::get_FFT()
总是返回一个CImgList<float>
或一个CImgList<double>
,这取决于原始类型T
(如果T
是unsigned 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.