Frage

Ich habe einen Auftrag über fftw und ich versuchte, ein kleines Programm zu schreiben, eine fft eines Bildes zu erstellen. Ich verwende CImg zu lesen und Bilder zu schreiben. Aber alles, was ich bekomme, ist ein dunkles Bild mit einem einzigen weißen Punkt: (

Ich bin höchstwahrscheinlich dies den falschen Weg zu tun, und ich würde es begrüßen, wenn jemand erklären könnte, wie dies geschehen soll. Ich habe nicht den Code benötigen, ich muß nur wissen, was der richtige Weg ist, dies zu tun.

Hier ist mein Code:

CImg<double> input("test3.bmp");
CImg<double> image_fft(input, false);

unsigned int nx = input.dimx(), ny = input.dimy();
size_t align = sizeof(Complex);

array2<Complex> in (nx, ny, align);

fft2d Forward(-1, in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        in(i,j) = input(i,j);
    }
}

Forward.fft(in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = std::abs(in(i,j));
    }
}

image_fft.normalize(0, 255);
image_fft.save("test.bmp");
War es hilfreich?

Lösung

Sie müssen das Protokoll der Größenordnung nehmen. Der einzige weiße Punkt ist der Basiswert (0 Hz, DC, was auch immer Sie es nennen wollen), so wird es immer mit Abstand fast die größte Komponente eines Bildes nehmen Sie (Da Pixelwerte nicht negativ sein kann, wird der DC-Wert immer positiv und groß sein).

Was Sie tun müssen, ist das Protokoll (ln, was auch immer, irgendeine Art von logarithmischer Berechnung) berechnet der Größe (so, nachdem Sie von Komplex Größe / Phase-Form umgewandelt haben (Phasor Notation iirc?)) An jedem Punkt bevor Sie es normalisieren.

Bitte beachten Sie, dass die Werte sind, sind sie nur sehr klein im Vergleich zu dem DC-Wert, das Protokoll nehmen (was kleinere Werte größer durch viel macht, und größere Werte nur geringfügig größer) wird die anderen Frequenzen sichtbar machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top