FFT zur Linienerkennung


8

Ich versuche, die FFT anders zu verwenden, als die meisten Leute fragen. Ich möchte in der Lage sein, ein Bild eines Diagramms mit sich regelmäßig wiederholenden vertikalen Linien aufzunehmen und das Bild zu verarbeiten, um zu bestimmen, wie weit die Linien in Pixel im Durchschnitt voneinander entfernt sind. Ich habe versucht, knifflige Kanten und Hough-Linien zu erkennen, und ich glaube nicht, dass ich die Bilder so optimieren kann, dass nur die Linien, an denen ich interessiert bin, genau erkannt werden.

Mein Versuch ist es also, 10 Zeilen des Bildes abzutasten und die Pixelwerte in Bins zu akkumulieren, die der Pixelspalte entsprechen. Das Ergebnis einer grafischen Darstellung ist eine sehr gut aussehende Wellenform. Wenn ich eine DFT oder FFT durchführe, kann ich einen Peak finden, von dem ich glaube, dass er die Häufigkeit der Linienwiederholung sein sollte. (Dies kann eine fehlerhafte Annahme sein)

Meine Frage ist, was entspricht diese Nummer? Das heißt, ich glaube, ich bin verwirrt mit meiner Abtastrate, weil sie in Pixel angegeben ist. Ich denke, dass dies eine gültige Verwendung der FFT ist, aber ich falle genau hier an dem Punkt, an dem ich denke, dass ich erfolgreich sein sollte.

Als Beispiel. Ich habe ein Bild mit einer Breite von 300 Pixel erstellt. Es gibt Linien mit einer Breite von 1 Pixel, die in Intervallen von genau 30 Pixel gezeichnet werden. Ich fand 2 Peaks, einen bei 75 und einen bei 225 (die symmetrisch erscheinen) für die reale Komponente. (Ich glaube nicht, dass die imaginäre Komponente spielen sollte?) Ich weiß, dass die Linien 30 Pixel voneinander entfernt sind. Wie hängen die 75 und oder 225 zusammen?

Ich bemühe mich sehr, dies zu erreichen, und ich bin dankbar für jede Hilfe, die Sie empfehlen können. An dieser Stelle gebe ich die Kantenerkennung auf und möchte diesen Ansatz ausprobieren.

Vielen Dank im Voraus.

image  opencv  fft  dft 

Vielen Dank für Ihre Antworten! Die FFT scheint einfach nicht zu funktionieren. Wie würde ich die imaginäre Komponente hinzufügen? Das Programm, das ich benutze (stat plus), spuckt nur eine Spalte mit reellen und imaginären Zahlen aus. Ich hatte das Real auf der x-Achse gezeichnet, aber ich bin sicher, dass es einen besseren Weg gibt, imaginäre Zahlen einzuschließen. Außerdem bin ich den Weg der Autokorrelation gegangen und habe ein Ergebnis erzielt! süß!, aber es wirft immer mehr Fragen auf. Das Ergebnis ist doppelt so groß wie das Originalbild (verständlicherweise), was in der Nähe der Mitte zu viel saubereren Schwingungen führt. Gibt es einen Reim oder Grund zu

Antworten:


6

Sie könnten versuchen, Autokorrelation dafür zu versuchen . Hier ist eine SO-Antwort, die beschreibt, wie eine Autokorrelation mit Matlab unter Verwendung von FFTs durchgeführt wird. Dies könnte für zwei Dimensionen erweitert werden.

Ich habe Ihren Testfall wie folgt in Numpy implementiert:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

Dies ergibt die folgende Darstellung:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, erscheinen die Peaks bei +/- 30.


4

Wenn Ihr Bild 10 vertikale Linien enthält, sollte eine FFT einer vollständigen horizontalen Scanlinie (300 Pixel) einen gewissen Größeninhalt um Bin 10 oder Bin 11 anzeigen. Bin 75 von 300 würde anzeigen, dass alle 4 Pixel etwas passiert, oder damit.

Sie müssen sich wirklich die Größe des FFT-Ergebnisses ansehen, nicht nur die "echte" Komponente (wirklich die gerade Komponente), denn wenn Ihre Gitterlinien nicht zentriert sind, kann der spektrale Inhalt als ungerade (also "imaginär") angezeigt werden. im FFT-Ergebnis).

Bei einer realen Eingabe in eine FFT enthalten die Ergebnisbereiche über N / 2 (in Ihrem Fall über 150) nur Wiederholungen derselben Daten mit Ausnahme von komplexen konjugierten Daten. Sie können sie also ignorieren.


0

FFTFFTFFT(1)(x+y))FFT

Ich bin mir nicht sehr sicher, aber irgendetwas sagt mir, dass der Abstand (in Pixel) zwischen dem Peak und dem Zentrum dann die Periodizität anzeigen würde. Sobald Sie die Periodizität haben, können Sie leicht den Abstand zwischen jedem Objekt ermitteln.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.