与えられた画像の2次元グレースケールスペクトルを描画するプログラムを作成しようとしています。私は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ビットの範囲に収まることを確認します。 –