Ich werde Ihnen zeigen, wie Sie mit Python ein dreifarbiges zusammengesetztes Diagramm erstellen, das in der Astronomie häufig verwendet wird.
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.
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)
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.
Erstellen Sie aus den drei heruntergeladenen Daten ein dreifarbiges zusammengesetztes Diagramm. Als Verfahren,
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.
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.
python rgbimage.py
--Laden Sie die Datei, geben Sie den Bereich an und speichern Sie sieWenn Sie es ausführen, sehen Sie ein Fenster wie dieses.
--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.
Klicken Sie abschließend auf "Speichern unter", um das Bild zu speichern.
Versuchen Sie, mit matplotlib mit astropy.wcs zu zeichnen.
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.