我正在尝试创建一个程序,该程序将绘制给定图像的二维灰度光谱。我正在使用OpenCV和FFTW库。通过使用来自互联网的提示和代码并修改它们,我设法加载一张图片,计算这张图片的fft并从fft重新创建图片(这是相同的)。我无法做的是画出傅立叶频谱本身。你可以帮我吗? 下面的代码(除去不太重要的行):在C++中绘制图像的频谱(fftw,OpenCV)
/* Copy input image */
/* Create output image */
/* Allocate input data for FFTW */
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
dft = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
/* Create plans */
plan_f = fftw_plan_dft_2d(w, h, in, dft, FFTW_FORWARD, FFTW_ESTIMATE);
/* Populate input data in row-major order */
for (i = 0, k = 0; i < h; i++)
{
for (j = 0; j < w; j++, k++)
{
in[k][0] = ((uchar*)(img1->imageData + i * img1->widthStep))[j];
in[k][1] = 0.;
}
}
/* forward DFT */
fftw_execute(plan_f);
/* spectrum */
for (i = 0, k = 0; i < h; i++)
{
for (j = 0; j < w; j++, k++)
((uchar*)(img2->imageData + i * img2->widthStep))[j] = sqrt(pow(dft[k][0],2) + pow(dft[k][1],2));
}
cvShowImage("iplimage_dft(): original", img1);
cvShowImage("iplimage_dft(): result", img2);
cvWaitKey(0);
/* Free memory */
}
的问题是 “频谱” 部分。我得到一些噪音,而不是谱。我究竟做错了什么?我会很感激你的帮助。
听起来像一个缩放问题 - 你应该检查你的FFT输出幅度值的范围。 –
你能建议我应该怎么做?从我在不同论坛上阅读的内容来看,如果是关于幅度的话,我会得到一个黑色的图像(中心有一个白点)。谢谢您的回答。 – Narren
既然你没有对幅度进行任何范围检查,那么如果它很大,当你将它分配给一个8位像素(它看起来像噪声)时,它会将模2包裹。这就是为什么我说你应该检查范围 - 例如添加另一个循环来查找最大和最小幅度,然后相应地缩放您的值,以便您知道它们将适合8位范围。 –