【问题标题】:Cimg FFt is showing noise image.How to get the proper FFT Image?Cimg FFT 显示噪声图像。如何获得正确的 FFT 图像?
【发布时间】:2026-01-10 20:20:04
【问题描述】:

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

【问题讨论】:

  • 我没有尝试过,只是猜测,但我想你需要转换为 float 沿线某处保存你的 FFT 数据的范围 - 它不是将适合unsigned char
  • 我应该将所有未签名的字符转换为浮点数吗?
  • 哇。这在 CImg 中是一个糟糕的设计选择。使用整数值计算 FFT 是没有意义的。从the very sparse docs 看来,该函数就地进行了计算。所以任何不是浮点类型的T 都会产生错误的结果。为什么这甚至可能是我无法理解的。
  • 您最好使用get_FFT,它会以适当的类型返回转换后的图像。
  • @CrisLuengo 我在将 unsigned char 转换为 float 时遇到分段错误。

标签: opencv fft cimg openvx


【解决方案1】:

您的代码中有几处错误:

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

  2. CImg&lt;T&gt;::get_FFT() 始终返回 CImgList&lt;float&gt;CImgList&lt;double&gt;,具体取决于原始类型 T(如果 Tunsigned char,则结果可能是 CImgList&lt;float&gt;)。但是如果你写

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 的一半数据)。

哦,在说您使用的任何库都缺乏设计之前,请先问问自己是否存在可能没有理解的内容。看了你的代码,我觉得在对如何设计编程库有相关意见之前,你还有很多东西要学。

【讨论】:

    最近更新 更多