Witam obecnie zajmuje się zagadnieniem TF dla obrazów, chodzi mi o FFT2D. Mam problem z widmem amplitudowym oraz mam parę pytań odnośnie operacji na nim.

  1. Mój główny problem to funkcja FFTPlot generuje mi tablice F-pikseli, potrzebne do sporządzenia widma, funkcja generuje mi fałszywy obraz widma(pozioma środkowa linia widma jest strasznie gruba). Czy ktoś mógłby mi powiedziec czy dobrze zrobiłem normalizację widma amplitudowego.

  2. Czy rozmiary widma (szerokość i wysokość widma) muszą mieć wielokrotności 2^x, ponieważ zauważyłem że dla obrazka np 512x512, 128x128 funkcja działa prawidłowo?~!.

  3. Jak z widma amp z powrotem wrócić do do COMPLEX[,] (części rzeczywistej i urojonej obrazu) aby dokonać iFF2D
    chodzi o to że mam sobie widmo amp i chce z niego wyciąć jakąś część jak to zrobić aby po iFF2D obraz był zmodyfikowany z tym co wykonałeś na widmie

 
public Image FFTPlot(COMPLEX[,] Output)
        {
            int i, j;
            float max;

            int nx = Output.GetLength(0);
            int ny = Output.GetLength(1);
            int Width = nx;
            int Height = ny;
            float[,] FFTLog = new float[nx, ny];
            float[,] FourierMagnitude = new float[nx, ny];

            FFTNormalized = new int[nx, ny];
            int[,] FFTPhaseNormalized = new int[nx, ny];

            for (i = 0; i <= Width - 1; i++)
                for (j = 0; j <= Height - 1; j++)
                {
                    FourierMagnitude[i, j] = Output[i, j].Magnitude();
                    FourierPhase[i, j] = Output[i, j].Phase();
                    FFTLog[i, j] = (float)Math.Log(1 + FourierMagnitude[i, j]);
                }

            max = FFTLog[0, 0];
            for (i = 0; i < Width; i++)
                for (j = 0; j < Height; j++)
                {
                    if (FFTLog[i, j] > max)
                    {
                        max = FFTLog[i, j];
                    }
                }
            for (i = 0; i <= Width - 1; i++)
                for (j = 0; j <= Height - 1; j++)
                {
                    FFTLog[i, j] = FFTLog[i, j];

                }
            for (i = 0; i <= Width - 1; i++)
                for (j = 0; j <= Height - 1; j++)
                {
                    FFTNormalized[i, j] = (int)(2000 * FFTLog[i, j]);
                }

            Image FourierPlot = Displayimage(FFTNormalized);
            return FourierPlot;
        }

Wynik działania funkcji FFTPlot:
<image> http://obrazki.elektroda.pl/7241340900_1297360361.jpg</image>
user image