如何解决Cimg FFt 显示噪声图像如何获得正确的 FFT 图像?
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;
}
我试过这个代码。但是我得到了噪声图像。有人可以帮助我获得所需的 fft 图像吗?我在 Linux 上运行。我已经发布了上面的图片。
解决方法
您的代码中有几处错误:
-
根据(数学)定义,FFT 的结果是浮点值图像。您无法将 FFT 图像准确地存储到
CImgList<unsigned char>
中。定义CImgList<float>
变量时,请改用CImgList<double>
或fft
。 您当前的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 的虚部。请注意,它与您在网络上找到的经典傅里叶图像不对应,这些图像实际上显示为 FFT 的居中 模块(较少使用相位),例如 >
https://cs.appstate.edu/ret/imageJ/PClabs/imlab/FFT/gif/imj-fft1.gif
得到这个需要额外的步骤来转换你得到的复值 FFT 作为这个标量图像表示(这实际上只适用于可视化,不适用于傅立叶空间中的实际计算,因为你丢失了 FFT 的一半数据).
哦,在说您使用的任何库缺乏设计之前,先问问自己是否有您可能不理解的地方。看着你的代码,我觉得在对如何设计编程库有相关意见之前,你还有很多东西要学。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。