Je vais vous montrer comment utiliser python pour créer un diagramme composite à trois couleurs qui est souvent utilisé en science astronomique.
L'astronomie gère les images dans un format de fichier appelé FITS. Vous pouvez également le télécharger sur SkyView Virtual Observatory. Vous pouvez également le télécharger à partir d'un navigateur Web, mais cette fois, je vais essayer de le télécharger automatiquement en utilisant python.
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 est Omega Une nébuleuse diffusée, connue sous le nom de nébuleuse, est la région où l'amas NGC6618, qui contient de nombreuses étoiles massives, ionise le gaz moléculaire environnant. C'est une région de formation d'étoiles de masse très active dans la galaxie Tenkawa.
2MASS est un projet d'observation du ciel dans le proche infrarouge. Les données pour la bande J (1,2 μm), la bande H (1,7 μm) et la bande Ks (2,2 μm) sont disponibles.
Créez un diagramme composite à trois couleurs à l'aide des trois données téléchargées. En tant que procédure,
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')
Une telle image sortira.
Spécifiez la plage, vérifiez l'image, spécifiez la plage, etc. pour trouver un bon jeu de couleurs. C'est difficile à répéter, j'ai donc créé un outil qui peut être utilisé avec une interface graphique.
--Téléchargez et enregistrez rgbimage.py
--Exécuter: python rgbimage.py
--Chargez le fichier, spécifiez la plage et enregistrez
Lorsque vous l'exécutez, vous verrez une fenêtre comme celle-ci.
--Cliquez sur "Ouvrir" pour ouvrir une boîte de dialogue dans laquelle vous pouvez sélectionner un fichier FITS --Menu d'options intitulé "linéaire": sélectionnez l'étirement entre "linéaire", "journal", "sqrt"
Cela ressemble à ceci lorsque divers réglages sont effectués.
Enfin, cliquez sur «Enregistrer sous» pour enregistrer l'image.
Essayez de tracer avec matplotlib en utilisant astropy.wcs.
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')
Une telle image apparaît.