Naja es sieht zu mindestens periodisch aus.
Macht doch eigentlich so mehr Sinn oder ?Code:for( i = 0, k = 0 ; i < image.size().height ; i++ ) { for( j = 0 ; j < image.size().width ; j++, k++ ) { image_data[k][0] = image.at<double>(i, j); image_data[k][1] = 0.0; } }
Schließlich durch läufst du zeilenweise und pro Zeile schaufelst du Daten. wenn k nicht zurückgesetzt wird, könnte das die Ursache sein.Code:for( i = 0 ; i < image.size().height ; i++ ) { for( j = 0, k = 0; j < image.size().width ; j++, k++ ) { image_data[k][0] = image.at<double>(i, j); image_data[k][1] = 0.0; } }
Grüße,
Daniel
Ich wäre ja froh wenn es das wäre.
Die Daten liegen sequentiell im Speicher. K ist der Zähler für das kontinuierliche Array, i und j die für Zeilen und Spalten.
Dabei gilt : k = i * image.size().width + j
Das hier:
entspricht dem hier:Code:for( i = 0, k = 0 ; i < image.size().height ; i++ ) { for( j = 0 ; j < image.size().width ; j++, k++ ) { image_data[k][0] = image.at<double>(i, j); image_data[k][1] = 0.0; } }
Der fancy image.at operator erspart einem nur den Pointer-Typecast und man kann direkt Pixel adressieren ohne sich über die Repräsentation im Speicher im klaren zu sein. (Deswegen muss hier auch explizit dach (double*) gecasted werden weil ich den Datentyp kenne.) Zweiteres ist halt schneller aber hässlicher.Code:/* load images' data to FFTW input*/ for( k = 0 ; k < size ; k++ ) { image_data[k][0] = ((double *) image.data)[k]; image_data[k][1] = 0.0; }
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
Naja, um ehrlich zu sein, ist die zweite weniger hässlich. Da sieht man wenigstens gleich was Sache ist.
Jedenfalls stimmt irgend etwas in deinen Zeilen nicht. Entweder beim Zusammensetzen oder schon beim Ergebnis der FFT benutzt du deine Hilfsvariablen a bis d garnicht ? Wunderte mich gerade darüber, dass du dort im Kommentar schreibst, dass du die konjungiert-komplexe Form berechnen willst, es aber nicht tust. Oder bin ich blind?
Grüße,
Daniel
Nein vollkommen richtig... Copy und Paste Fehler, Ich habe es oben korrigiert.Oder bin ich blind?
Und ... Ich hab den Fehler gefunden. Der Code funktioniert, es hing (hängt) am theretischen Verständnis. Das Bild (image) muss anscheinend eine Zweierpotenz als Seitenlänge aufweisen. Also 2,4,8,16 ... px hoch und breit.
Ich hatte das bisher überlesen oder ignoriert.
Soweit so schön. Und jetzt geh ich ins Bett.
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
Ok, das hatte ich irgendwie auch vorausgesetzt. Da die FFT ja bekanntlich nur für 2er Potenzen richtig funktioniert. Das würde dann die Artefakte erklären. Aber schön, dass es funktioniert.
Grüße,
Daniel
Lesezeichen