[PYTHON] Erstellen Sie ein zusammengesetztes RGB 3-Farbdiagramm

Was ist das

Ich werde Ihnen zeigen, wie Sie mit Python ein dreifarbiges zusammengesetztes Diagramm erstellen, das in der Astronomie häufig verwendet wird.

Zu verwendendes Modul

Inhaltsverzeichnis

  1. Bereiten Sie drei Arten von Bildern vor: Rot, Grün und Blau.
  2. Verwenden Sie PIL.Image, um 3 Farben zu synthetisieren
  3. Erstellen Sie interaktiv ein dreifarbiges zusammengesetztes Diagramm mit rgbimage.py

1. Bildvorbereitung

Die Astronomie verwaltet Bilder in einem Dateiformat namens FITS. Sie können es auch unter SkyView Virtual Observatory herunterladen. Sie können es auch von einem Webbrowser herunterladen, aber dieses Mal werde ich versuchen, es automatisch mit Python herunterzuladen.

Code

download.py


from astroquery.skyview import SkyView
import astropy.units

target = 'M17'
surveys = ['2MASS-J', '2MASS-H', '2MASS-K']
radius = 0.3 * astropy.units.deg
pixels = 1000

hdu = SkyView.get_images(target, surveys, radius=radius, pixels=pixels)
hdu[0].writeto('M17-2MASS-J.fits', clobber=True)
hdu[1].writeto('M17-2MASS-H.fits', clobber=True)
hdu[2].writeto('M17-2MASS-K.fits', clobber=True)

Eine kleine Einführung

M17 ist Omega Ein diffuser Nebel, bekannt als Nebel, ist die Region, in der der NGC6618-Cluster, der viele massive Sterne enthält, das umgebende molekulare Gas ionisiert. Es ist eine sehr aktive Region zur Bildung von Massensternen in der Tenkawa-Galaxie.

2MASS ist ein All-Sky-Vermessungsbeobachtungsprojekt im nahen Infrarot. Daten für das J-Band (1,2 μm), das H-Band (1,7 μm) und das Ks-Band (2,2 μm) sind verfügbar.

2. Erstellen Sie mit PIL.Image ein dreifarbiges zusammengesetztes Diagramm

Erstellen Sie aus den drei heruntergeladenen Daten ein dreifarbiges zusammengesetztes Diagramm. Als Verfahren,

  1. Lesen Sie die FITS-Datei
  2. Bestimmen Sie den Bereich von min und max und konvertieren Sie ihn in den Typ 0-255 int
  3. Speichern Sie das Bild Ich werde weiter machen.

Code

plot.py


import numpy
import PIL.Image
import astropy.io.fits

r = astropy.io.fits.open('M17-2MASS-K.fits')[0].data[::-1,:]
g = astropy.io.fits.open('M17-2MASS-H.fits')[0].data[::-1,:]
b = astropy.io.fits.open('M17-2MASS-J.fits')[0].data[::-1,:]

pix_y, pix_x = r.shape


def scale(data, scale_min=None, scale_max=None, stretch='linear'):
    if stretch == 'linear':
        scale_func = scale_linear
    elif stretch == 'log':
        scale_func = scale_log
    else:
        scale_func = scale_linear
        pass

    if scale_min is None:
        scale_min = numpy.nanmin(data)
        pass

    if scale_max is None:
        scale_max = numpy.nanmax(data)
        pass

    scaled = scale_func(data, scale_min, scale_max)
    scaled = numpy.uint8(scaled * 255)
    return scaled

def scale_linear(data, scale_min, scale_max):
    print('%f, %f'%(scale_min, scale_max))
    scaled = (data - scale_min) / (scale_max - scale_min)
    scaled[numpy.where(scaled<0)] = 0
    scaled[numpy.where(scaled>=1)] = 1
    return scaled

def scale_log(data, scale_min, scale_max):
    print('%e, %e'%(scale_min, scale_max))
    scaled = scale_linear(data, scale_min, scale_max)
    scaled = numpy.log10((scaled * 9) + 1)
    return scaled


img = numpy.zeros([pix_y, pix_x, 3], dtype=numpy.uint8)
img[:,:,0] = scale(r, 630, 840, 'log')
img[:,:,1] = scale(g, 595, 730, 'log')
img[:,:,2] = scale(b, 150, 190, 'log')

PIL.Image.fromarray(img).save('rgbimage-M17-2MASS.png')

Ein solches Bild wird herauskommen.

rgbimage-M17-2MASS.png

3. Erstellen Sie interaktiv ein dreifarbiges zusammengesetztes Diagramm

Geben Sie den Bereich an, überprüfen Sie das Bild, geben Sie den Bereich an usw., um ein gutes Farbschema zu finden. Es ist schwer, viel zu wiederholen, deshalb habe ich ein Tool erstellt, das mit der GUI bedient werden kann.

rgbimage.py

Wie benutzt man

Wenn Sie es ausführen, sehen Sie ein Fenster wie dieses. スクリーンショット 2017-01-16 16.38.57.png

--Klicken Sie auf "Öffnen", um einen Dialog zu öffnen, in dem Sie eine FITS-Datei auswählen können --Option-Menü mit der Bezeichnung "linear": Wählen Sie "strecken" aus "linear", "log", "sqrt".

Es sieht so aus, wenn verschiedene Einstellungen vorgenommen werden. スクリーンショット 2017-01-16 16.45.39.png

Klicken Sie abschließend auf "Speichern unter", um das Bild zu speichern.

4. Fügen Sie dem erstellten Bild Koordinaten hinzu

Versuchen Sie, mit matplotlib mit astropy.wcs zu zeichnen.

Code

plot_with_coordinate.py


import astropy.io.fits
import astropy.wcs
import astropy.units
import matplotlib.pyplot
import PIL.Image

matplotlib.rcParams['font.family'] = 'arial'

hdu = astropy.io.fits.open('M17-2MASS-K.fits')[0]
wcs = astropy.wcs.WCS(hdu.header)
img = PIL.Image.open('rgbimage-M17-2MASS.png')

fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111, projection=wcs)
ax.imshow(img)
ax.grid(color='w', linestyle='-')
ax.coords[0].set_major_formatter('hh:mm:ss')
ax.coords[1].set_major_formatter('dd:mm')
ax.set_xlabel('R.A. (J2000)')
ax.set_ylabel('Dec. (J2000)')

ax2 = ax.get_coords_overlay('galactic')
ax2[0].set_ticks(spacing=0.05*astropy.units.deg)
ax2[1].set_ticks(spacing=0.05*astropy.units.deg)
ax2[0].set_major_formatter('d.dd')
ax2[1].set_major_formatter('d.dd')
ax2[0].set_axislabel('Galactic Longitude')
ax2[1].set_axislabel('Galactic Latitude')
ax2.grid(color='y', linestyle='-')

fig.savefig('rgbimage-M17-2MASS-withcoord.png')

Ein solches Bild erscheint. rgbimage-M17-2MASS-withcoord.png

Recommended Posts

Erstellen Sie ein zusammengesetztes RGB 3-Farbdiagramm
Bildfarbe extrahieren (RGB)
Erstellen Sie eine MQTT Publisher-Box
Lassen Sie uns ein Errbot-Plugin erstellen
Erstellen Sie eine MQTT-Abonnentenbox