Frage

Es gibt eine gute Funktion, die ich brauche, die im Java -Programm implementiert ist: ImageJ. Ich muss den dort verwendeten Algorithmus verstehen. Die Funktion hat mehrere Parameter:Link Text

Und bevor es FFT verwendet, konvertiert es das Bild in einen speziellen: Der Bandpassfilter verwendet einen speziellen Algorithmus, um Kantenartefakte zu reduzieren an den Rändern vorkommen)

Können Sie mir mehr über diese besondere Transformation erzählen? Eigentlich das spiegelte Bild.

Ich schreibe über C ++ und möchte diesen Teil des Programms auf C ++ neu schreiben.

Edit1: Ich muss verstehen, wie es diese Fliesenspiegel -Bildoperation erledigt. Möglicherweise ist es etwas Besonderes. Tatsächlich wandelt es sich zunächst in ein Bild in ein neues Bild um, so dass es für meine Bilder: Konvertion von 600 x 480 bis 1024x1024 -Bild sein wird. Wie wird hier die Fliesen verwendet?

Edit2: Außerdem ist es schwierig, diese Beschreibung der Tilemirrored -Funktion zu verstehen:

Steckt ImageProcessor (ROI) in einen neuen Bildprozessor mit Größenbreite x Höhe y an Position (x, y). Das Bild spiegelt sich an seinen Kanten wider, um die Auswirkungen des FFT umzuwickeln. Was ist mit "... der Größenbreite x Höhe y an Position (x, y) gemeint."?

Edit3: Ich habe diesen Bandpassfilter implementiert und er liefert die gleichen Ergebnisse wie das ursprüngliche Programm. Der Algorithmus selbst in Originalprogramm (ebenfalls in meinem Programm) ist jedoch sehr langsam. Ich möchte diesen Filter nicht einmal in meinem Programm verwenden, sondern berechnet jedoch ungefähr 0,5 bis 2 Sekunden pro Aufruf (abhängig vom Parameterwert). Es wird eine FHT -Transformation verwendet (nicht FFT), ist es schneller als FFT? Ich denke, der Filter selbst ist nicht optimiert. Weitere Informationen finden Sie in FilterLargesMall -Funktionen:Quellcode

War es hilfreich?

Lösung

Ich weiß nicht genau, wie diese Funktion funktioniert, aber hier ist der grundlegende Algorithmus für eine ähnliche Funktion:

  1. Bestimmen Sie die kleinste Leistung von zwei (nennen Sie es Nachrichten), die größer ist als die größere der beiden Abmessungen des Bildes (nennen Sie sie xsize & ysize).

  2. Erstellen Sie ein neues quadratisches Bild von Größennachrichten, indem Sie den Inhalt des Bildes in die Mitte des neuen Bildes in die Mitte des neuen Bildes haben (dh der oberen links (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Füllen Sie die verbleibenden Pixel wie folgt für jedes Pixel bei (x, y) aus:

    • wenn x < (newSize / 2 - xSize / 2), Kopieren Sie das Pixel in der Spalte (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x und Reihe y.
    • wenn y < (newSize / 2 - ySize / 2), Kopieren Sie das Pixel in der Reihe (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y und Spalte x.
    • Wenn beide der oben genannten TRUE sind, kopieren Sie das Pixel in der Spalte (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, die Zeile (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • wenn x > (newSize / 2 + xSize / 2), Kopieren Sie das Pixel in der Spalte (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x und Reihe y.
    • wenn y > (newSize / 2 + ySize / 2), Kopieren Sie das Pixel in der Reihe (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y und Spalte x.
    • Wenn beide der oben genannten TRUE sind, kopieren Sie das Pixel in der Spalte (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x und Reihe (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Es gibt wahrscheinlich Bibliotheken, die dies einfacher machen (dh Flipping und Kopieren von Bilddaten), aber ich bin mit C ++ nicht vertraut, und dies sollte ziemlich einfach sein, sich selbst zu codieren, solange die Leistung kein großes Problem ist. Achten Sie auf Rundungsprobleme für Bilder mit ungeraden Dimensionen: Stellen Sie sicher, dass sie konsistent sind.

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