Simulation von Beugungsbildern mit ImageJ

  • Hallo zusammen,


    nachdem nun mein anderer Thread (Simulation Einfluss Fangspiegel/Spinne/etc auf Beugungsbild) langsam heiss läuft und das Interesse an verschiedenen Obstruktionen und Geometrien gross und grösser wird ist es Zeit, das "wie" aus diesem Thread auszulagern.


    Angefangen hatte es ja mit meiner Frage, welchen Einfluss diverse Geometrien auf das Beugungsbild haben und wie man das simulieren und visualisieren kann. Erste Versuche waren kläglich gescheitert, ein Ausflug zu Maskulator (http://www.njnoordhoek.com/?p=376) schien erfolgversprechend. Nach ausgiebiger Lektüre des Threads https://www.cloudynights.com/t…what-to-do-what-to-avoid/ in Cloudynights und einigen Papers habe ich weiter mit Fiji (ImageJ) gespielt. Maskulator hat ein paar Probleme, die die Genauigkeit der Resultate begrenzt. So ist die FFT auf 2kx2k begrenzt, die Dateien haben grundsätzlich nur 8-bit Tiefe. Vergleiche mit verschiedenen Geometrien sind so nur bedingt möglich. Leider ist Niels, der Autor von Maskulator vor ein paar Jahren verstorben, so dass die Software meines Wissens nicht mehr weiterentwickelt wird.


    Als dann der Astrotreff kurzzeitig gegroundet war habe ich die Zeit genutzt, meine Versuche in Makros zu giessen, so dass die Auswertung automatisch abgearbeitet werden kann. Die Makros sind weder professionell noch optimiert, tun aber, was ich von ihnen erwarte.


    So wie es aussieht, scheint das Thema auch andere zu interessieren, deshalb möchte ich euch das ganze hier so vorstellen, dass es (hoffentlich) auch ohne meine Hilfe möglich ist, selber solche Auswertungen zu machen.


    Wie gesagt arbeite ich (nicht nur für diese Aufgabe) mit Fiji (ImageJ) (https://imagej.net/software/fiji/). Fiji steht für Fiji ist just ImageJ und ist eine sofort lauffähige Version von ImageJ. Dieses wiederum ist ein in Java geschriebenes Framework zur Bildverarbeitung und -analyse im wissenschaftlichen Bereich. Wie in diesem Bereich üblich wird davon ausgegangen, dass der Benutzer mit einer mehr oder weniger ungeordneten Werkzeugkiste umgehen kann. Wer magische Knöpfe wie in Photoshop erwartet, hat eine steinige Lernkurve vor sich, die sich aber lohnt.

    Ich spare mir eine Einführung in ImageJ, erst mal einfach etwas spielen und das System dahinter verstehen. Für uns wichtig ist hier: die Software kann vollständig skriptbasiert verwendet werden. Theoretisch können auch sehr viele Dateien als Stack verarbeitet werden, was aber hier nicht benötigt wird.


    Also: ImageJ (Fiji) installieren, dann seit ihr (fast) bereit. Einzig der Plugin Polar Transformer (https://imagej.nih.gov/ij/plugins/polar-transformer.html) wird noch benötigt und muss installiert werden.


    Das Vorgehen ist folgendermassen:


    1. Als Ausgangspunkt brauchen wir eine Datei mit der gewünschten Maske. Um Artefakte bei der Fouriertransformation zu minimieren, muss die eigentliche Maske auf idealerweise <10% der Bildgrösse begrenzt werden. Das heisst eine Maske von 1500x1500 px (Pixeln) braucht einen schwarzen Trauerrand, der das Bild auf >15kx15k aufbläst. Ich habe mich für 2^14x2^14 (16384x16384)px entschieden. Da es nur transparent/opak gibt, ist die Dateigrösse bei PNG Format trotzdem nur ca. 45kB gross.

    Die Masken habe ich in Freecad erstellt, als SVG exportiert, mit Inkscape geladen und als 1bit PNG mit 16kx16k Pixeln exportiert. Vorteil: in Freecad kann die gewünschte Geometrie exakt konstruiert werden, Inkscape arbeitet nativ mit SVG und kann Bitmaps exportieren.

    Leider können solche Dateien nicht hier hochgeladen werden. Ich werde sie auf meinen SFTP Server laden und dann den Zugang hier posten.


    2. ImageJ starten:



    3. Maske(n) (PNG Datei(en)) damit öffnen. Das kann entweder über den Reiter "File" geschehen oder indem man die Datei(en) auf das oben gezeigte Fenster zieht.


    4. Makro "calc_mask.ijm" und "calc_diff.ijm" öffnen.


    5. Maskendatei selektieren


    6. "calc_mask.ijm" selektieren und mit RUN starten:



    Dieser Skript extrahiert den zentralen Teil der Maske für Dokumentationszwecke.


    7. "calc_diff.ijm" starten. Nun rattert es eine Weile.

    - Der Skript macht erst mal eine FFT (Fouriertransformation) der Maske, was auf meinem Rechner ca, 25s dauert. Je nach Rechnerleistung kann das auch länger gehen.

    - Der zentrale Ausschnitt der so gerechneten PSF (Point Spread Function) wird als 32bit TIFF abgespeichert.

    - Anschliessend wird logarithmiert und auf -mag (Minus Magnitude) skaliert. Damit das ganze visuell besser erkennbar ist, wird eine farbige LUT (Look Up Table) verwendet.

    - dieses Bild wird als 8bit PNG abgespeichert.

    8. Jetzt gehts rund. Aus diesem Bild wird ein 3D Plot erstellt und ebenfalls als PNG abgespeichert. Im Prinzip kann man in diesem Plot live rumfahren, wer das will, führt den Skript nur bis dahin aus (Im Skript auswählen, was man ausführen will und mit (CTRL-Shift-R) ausführen.

    9. Anschliessend wird eine Linie vom Zentrum zum rechten Rand markiert. Entlang dieser wird ein Plot erzeugt, der die Intensität vom Zentrum her abbildet.

    Dieser Plot wird optisch etwas aufgemöbelt und als PNG abgespeichert. Die hinterlegten Daten werden zusätzlich als CSV Datei abgeschpeichert.


    Wer genug hat, kann hier aufhören. Aber: ausser bei rotationssymmetrischen Beugungsbildern schwankt die Intensität über den Winkel. Und deshalb machen wir weiter.


    10. Nun wird das Beugungsbild abgewickelt. Mit einer Polartransformation werden vom Zentrum her Kreise über 360° als Geraden dargestellt. Das gibt eine Art Landkarte.

    Da dieses Plugin nur mit 8-bit oder 16-bit Daten arbeitet, müssen einige Informationen zwischengespeichert und die Bilder entsprechend skaliert werden.

    11. Nun kommt eines der mächigsten Tools von ImageJ zur Anwendung der ROI-Manager. Dieser erlaubt es, entweder mit geeigneten Operation automatisch oder, wie in diesem Fall, manuell ROI (Regions of Interest) zu definieren und anschliessend darüber weitere Operationen auszuführen. Wir sind interessiert, den polaren Verlauf der Beugungsringe darzustellen. Der Skript erstellt dazu Linien im Abstand von 17px, was dem Abstand der Maxima entspricht.

    12. Nun rattert der ROI Manager und erstellt 11 Plots der ersten 11 Beugungsringe. Der Plot wird ebenfalls als PNG Datei, die Daten dahinter als CSV abgespeichert

    13. Aufräumen. Alle Dateien werden geschlossen.


    Das ganze ist ein wildes Gezuckel und am Ende liegen ein paar neue Dateien auf der Disk, hier für eine obstruktionsfreie Apertur:



    <Maskendateiname>_diff.tif (PSF, linear)

    Zu gross zum Hochladen (ca. 16MB)...


    <Maskendateiname>_diff.png (PSF, logarithmisch in -mag)



    <Maskendateiname>_sp.png (PSF Plot in 3D)



    <Maskendateiname>_plot.tif (PSF Plot entlang einer Linie vom Zentrum nach aussen)



    <Maskendateiname>_values.csv (Plotdaten dazu)


    <Maskendateiname>_pol.png (PSF als Polardarstellung)



    <Maskendateiname>_angular_psf.png (Plot dazu)



    <Maskendateiname>_apsf.csv (Plotdaten dazu)


    Wie schon geschrieben, Skripte können auch partiell ausgeführt werden, allerdings muss bedacht werden, dass Variablen nur während der Laufzeit bekannt sind, Schrittweises Ausführen (z.B. zum Debuggen) kann da etwas mühsam sein.


    Die Forensoftware teilt mir gerade mit, dass ich zu geschwätzig bin und die Nachrichtenlänge auf 10k Zeilen begrenzt ist. Die Skipte folgen deshalb als eigener Beitrag.


    Wenn Fragen sind (was ich annehme, das wird nicht auf Anhieb funktionieren), einfach fragen. Ich werde den Beitrag entsprechend anpassen und ergänzen.


    Have fun


    Herzliche Grüsse Robert

    Ich habe keine besondere Begabung, sondern bin nur leidenschaftlich neugierig. (Albert Einstein)

  • Hier die Skripte.

    So, hier noch die Skripte in voller Hässlichkeit:



    Ich habe keine besondere Begabung, sondern bin nur leidenschaftlich neugierig. (Albert Einstein)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!