Verwenden von iOS-Beschleunigenrahmen für 2D-Signalverarbeitung auf Nicht-Power-of-Two-Bildern?

StackOverflow https://stackoverflow.com//questions/10708667

Frage

// edit ...

Ich bearbeite meine Frage leicht, um das Problem der Arbeit speziell mit Nicht-Power-of-Two-Bildern anzusprechen. Ich habe eine grundlegende Struktur, die mit quadratischen Graustufenbildern mit Größen wie 256x256 oder 1024x1024 arbeitet, kann jedoch nicht sehen, wie er in willkürlich großen Bildern generalisiert wird. Die FFT-Funktionen scheinen zu wollen, dass Sie das Log2 der Breite und Höhe aufnehmen, aber es ist unklar, wie Sie die resultierenden Daten auspacken oder wenn die Daten nicht nur verschlüsselt werden. Ich nehme an, die offensichtliche Sache wäre, das NPOT-Bild innerhalb eines größeren, allen schwarzen Bildes zu zentrieren, und ignorieren Sie dann alle Werte in diesen Positionen, wenn Sie die Daten betrachten. Aber frage mich, ob es weniger unbeholfen ist, mit NPOT-Daten zu arbeiten.

// ... ende bearbeiten

Ich habe ein bisschen Ärger mit der beschleunigen Rahmendokumentation. Ich würde normalerweise FFTW3 verwenden, aber ich habe Probleme, das auf einem eigentlichen iOS-Gerät zu kompilieren (siehe dies Frage ). Kann mir jemand auf eine super einfache Implementierung mit Beschleunigen zeigen, die etwas wie folgt tut:

1) schaltet Bilddaten in eine geeignete Datenstruktur, die an die FFT-Methoden der Beschleunigung weitergeleitet werden kann.
In FFTW3, an seinem einfachsten, unter Verwendung eines Graustufenbildes, dadurch, dass die nicht signierten Bytes in ein "FFTW_COMPLEX" -Array eingesetzt werden, das einfach eine Struktur von zwei Schwimmern ist, die den echten Wert und der andere das imaginäre (und wo das Imaginäre ist für jedes Pixel auf Null initialisiert).

2) nimmt diese Datenstruktur an und führt eine FFT darin aus.

3) druckt die Größe und die Phase aus.

4) Führt ein IFFT darauf aus.

5) erstellt das ursprüngliche Bild von den Daten, die sich aus der IFFT ergeben.

Obwohl dies ein sehr einfaches Beispiel ist, habe ich Probleme mit der Dokumentation von Apples Site. Die so Antwort von pi hier ist sehr hilfreich, aber ich bin immer noch Etwas verwirrt darüber, wie Sie beschleunigen, um diese grundlegende Funktionalität mit einem Graustufen-Bild (oder farbigem) 2D-Bild zu erledigen.

Wie viele Zeiger oder besonders ein einfacher Arbeitscode, der ein 2D-Bild verarbeitet, wäre äußerst hilfreich!

\\\ edit \\\

okay, nachdem Sie einige Zeit genommen haben, um in die Dokumentation zu tauchen, und einen sehr hilfsbereiten Code auf so und auf pkmital's github repo , ich habe einen Arbeiter, den ich dachte, ich dachte, ich würde seit 1 posten, es dauerte eine Weile, um es herauszufinden, und 2) da ich ein paar habe Restliche Fragen ...

Initialisieren Sie den FFT-Plan. Annahme einer quadratischen Power-of-zwei-Bild:

generasacodicetagpre.

Pass in ein Byte-Array für ein quadratisches Power-of-Zwei-Graustufenbild und drehen Sie es in einen komplexen_split:

generasacodicetagpre.

Führen Sie die FFT auf den transformierten Bilddaten aus, schnappen Sie sich die Größe und Phase:

generasacodicetagpre.

Jetzt können Sie ein IFFT auf den Out_FFT-Daten ausführen, um das Originalbild zu erhalten ...

generasacodicetagpre.

oder Sie können ein IFFT in der Größe ausführen, um eine Autokorrelation zu erhalten ...

generasacodicetagpre.

Zum Schluss können Sie die IFFT-Ergebnisse in ein Bild-Array zurücklegen:

generasacodicetagpre.

Ich habe nicht herausgefunden, wie man den Beschleunigungsrahmen verwenden, um Nicht-Power-of-Two-Bilde zu handhaben. Wenn ich im Setup genügend Speicherplatz zuzeigle, kann ich eine FFT ausführen, gefolgt von einem IFFT, um mein Originalbild zu erhalten. Aber wenn Sie versuchen, eine Autokorrelation (mit der Größe der FFT) auszuführen, dann erhält mein Image Walky-Ergebnisse. Ich bin nicht sicher, ob der beste Weg, das Bild angemessen aufzuteilen, so hoffentlich jemand hat, wie man das tun kann. (Oder teilen Sie eine Arbeitsversion der vdsp_conv-Methode!)

War es hilfreich?

Lösung

Ich würde sagen, dass, um Arbeit an willkürlichen Bildgrößen durchzuführen, alles, was Sie tun müssen, Ihre Eingabewert-Array angemessen auf die nächste Leistung von 2 aufweisen.

Der harte Teil ist, wo Sie Ihre ursprünglichen Bilddaten einstellen und mit dem Sie füllen können. Was Sie wirklich versuchen, das Bild oder die Datenmine aus dem Bild zu tun, ist entscheidend.

in der verknüpften PDF unten, achten Sie besonders auf den Absatz direkt über 12.4.2 http://www.maths.org/java/programs/ft /Ftinfo/c12-4.pdf

Während das obige über die Manipulation entlang der 2 Achsen spricht, könnten wir vor der zweiten Abmessung eine ähnliche Idee durchführen und auf die zweite Dimension folgen. Wenn ich richtig bin, kann dieses Beispiel anwenden (und dies ist keineswegs ein exakter Algorithmus):

sagen wir, wir haben ein Bild, das 900 von 900 ist: Zuerst könnten wir das Bild in vertikale Streifen von 512, 256, 128 und 4 aufteilen. Wir würden dann 4 1D fFTs für jede Zeile verarbeiten, eines für die ersten 512 Pixel, der nächste für die folgenden 256 Pixel, der nächste für die folgenden 128, dann das letzte für die verbleibenden 4. Da die Leistung der FFT im Wesentlichen beliebt ist Die Frequenz, dann könnten diese einfach hinzugefügt werden (von der Frequenz nur perspektivisch, nicht den Winkelversatz). Wir könnten dann das gleiche Technik in Richtung der 2. Dimension drängen. An diesem Punkt hätten wir jedes Eingangspixel berücksichtigt, ohne sich tatsächlich aufkissen zu müssen.

Dies ist wirklich nur das Essen zum Gedanken, ich habe das selbst nicht ausprobiert, und sollte dies in der Tat das selbst erforschen. Wenn Sie diese Art von Arbeiten wirklich tun, haben Sie möglicherweise mehr Zeit als an dieser Stelle.

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