[PYTHON] Créer un diagramme composite RVB 3 couleurs

Qu'est-ce que c'est

Je vais vous montrer comment utiliser python pour créer un diagramme composite à trois couleurs qui est souvent utilisé en science astronomique.

Module à utiliser

table des matières

  1. Préparez trois types d'images: rouge, verte et bleue.
  2. Utilisez PIL.Image pour synthétiser 3 couleurs
  3. Créez de manière interactive un diagramme composite à 3 couleurs à l'aide de rgbimage.py

1. Préparation de l'image

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.

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)

Une petite introduction

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.

2. Créez un diagramme composite à trois couleurs à l'aide de PIL.

Créez un diagramme composite à trois couleurs à l'aide des trois données téléchargées. En tant que procédure,

  1. Lisez le fichier FITS
  2. Déterminez la plage de min et max et convertissez en type 0-255 int
  3. Enregistrez l'image Je continuerai à faire.

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')

Une telle image sortira.

rgbimage-M17-2MASS.png

3. Créer de manière interactive un diagramme composite à 3 couleurs

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.

rgbimage.py

Comment utiliser

--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. スクリーンショット 2017-01-16 16.38.57.png

--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. スクリーンショット 2017-01-16 16.45.39.png

Enfin, cliquez sur «Enregistrer sous» pour enregistrer l'image.

4. Ajoutez des coordonnées à l'image créée

Essayez de tracer avec matplotlib en utilisant astropy.wcs.

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')

Une telle image apparaît. rgbimage-M17-2MASS-withcoord.png

Recommended Posts

Créer un diagramme composite RVB 3 couleurs
Extraire la couleur de l'image (RVB)
Créer une boîte de publication MQTT
Faisons un plugin Errbot
Créer une boîte d'abonné MQTT