Konvertieren eines RGB-Bildes in Anpassungen (Astropie)

Ich versuche, ein NumPy-RGB-Array (ein 3D-Array mit der Dimension 512x512x3) in einer .fits-Datei mit astropy.io. Das Speichern dieses Arrays in einer .png-Datei funktioniert einwandfrei, aber wenn ich versuche, es mit in eine .fits-Datei zu speichern HDUList.writeto, werden nur Müllfarben erzeugt. Außerdem muss ich das Bild so umformen:

img = img.reshape(img.shape[2], img.shape[0], img.shape[1])

oder es wird versucht, nur 3 Spalten des Bildes statt 512 zu speichern.

Jedes Element im 3D-Array enthält einen Wert zwischen 0 und 255.

Was bedeutet "es produziert nur Müllfarben"? FITS-Dateien sind nicht zum Speichern von RGB-"Farben" gedacht.

Antworten (1)

Ich habe noch nicht viel astronomische Bildverarbeitung gemacht, aber da diese Frage unbeantwortet ist, werde ich es versuchen - hoffentlich mit etwas Erfolg. Wenn das Problem spezifischer ist, wäre ein Codebeispiel/Bildbeispiel wahrscheinlich für die weitere Diagnose nützlich, aber ansonsten kann dieses Beispiel hilfreich sein. Es erläutert den Vorgang des Schreibens eines 3-Kanal-Bildes in separate FITS-Bilder. Ich würde dies zuerst versuchen und prüfen, ob diese Ausgabe auch Müll ist - es könnte nur ein Problem mit der Verwendung der Funktion HDUList.writeto () sein. Der relevante Code wird unten eingefügt (mit ein paar Änderungen, da das Beispiel zunächst die Pillow Image-Klasse verwendet):

Teilen Sie die drei Kanäle (RGB):

r, g, b = img[:, :, 0], img[:, :, 1], img[:, :, 2]

Schreiben Sie die Kanäle als separate FITS-Bilder aus

red = fits.PrimaryHDU(data=r)
red.writeto('red.fits')

green = fits.PrimaryHDU(data=g)
green.writeto('green.fits')

blue = fits.PrimaryHDU(data=b)
blue.writeto('blue.fits')

Auch aus Neugier - warum speichert Ihr "numpy RGB-Array" Werte zwischen 0 und 512? Der Standard für Bilder sind normalerweise ganze Zahlen zwischen 0-255 oder Floats zwischen 0 und 1; Aber ich vermute, dass die Astronomie eine größere Bittiefe erfordert? In jedem Fall sollten Sie auch darauf achten, dass der dtype Ihres numpy-Arrays groß genug für die gewünschte Bittiefe ist – oft werden Bilder mit dtype="uint8" gespeichert, das von 0 bis 255 reicht.

Hallo, danke für deine Antwort. Ich habe versucht, die RGB-Kanäle aufzuteilen und eine .fits-Datei für jeden Kanal zu speichern, wie Sie es beschrieben haben. Es funktioniert, aber die beobachteten Intensitäten unterscheiden sich deutlich von der .png-Datei. Ich denke, ich muss die Werte irgendwie umwandeln, bevor ich sie speichere, um ein gutes Ergebnis zu erzielen, aber ich weiß nicht wirklich, was das ist. Außerdem haben Sie Recht mit dem Bereich 0-255, das war mein Fehler.
Ich habe hier ein Beispiel-PNG mit einem .fits für die R-, G-, B-Kanäle hochgeladen: Link
@user3042966 Womit beobachtest du die Intensitäten? Astronomische Software wie ds9 stellt die Farbskala möglicherweise nur auf log statt auf lineare Werte ein, was den Eindruck erweckt, dass die Intensitäten ausgeschaltet sind.