Association Astronomique de l’Indre
Slogan du site

Le site officiel de l’Association Astronomique de l’Indre.
Association loi 1901 , dont le but est la promotion de la culture et de la réflexion scientifique, en particulier dans les domaines liés à l’astronomie et aux sciences de l’espace.

Astrophotographie : comparer les magnitudes avec un programme Python

Un petit programme qui, en utilisant la souris, permet de faire la somme des valeurs des pixels d’une étoile (ou du fond)

Article mis en ligne le 8 décembre 2017
dernière modification le 1er novembre 2022

Présentation illustrée minimaliste

1. Présentation de l’image

Sur les marges à gauche et en bas : coordonnées des pixels.
Au centre : l’image.
La zone encadrée correspond au dernier pointage effectué avec la souris.

2. Présentation des résultats obtenus

Les résultats des « clics souris » s’affichent sur cet écran.
La somme désigne la somme des pixels d’une zone carrée dont l’étoile est le centre. Elle contient les pixels de l’étoile, mais aussi des pixels de fond.
Centre sur donne les coordonnées du centre du carré sélectionné.

  1. La zone encadrée en jaune correspond à des zones carrées choisies sans étoiles : cela permet par exemple de calculer une valeur moyenne pour le fond.
  2. La zone encadrée en rouge correspond à des zones carrées contenant une étoile. La dernière ligne correspond à l’étoile encadrée de l’image précédente.

3. Idée directrice

Plus la somme des pixels d’un carré est grande, plus l’étoile est lumineuse.
C’est simpliste, mais on pourra améliorer par la suite.
L’idée est ici de « faire fonctionner » pour vérifier si l’on peut réaliser un programme qui marche.

4. Le programme Python

Le code est listé à la fin de l’article.
Utilisation de deux bibliothèques très aidantes :
Astropy : donne accès aux données d’un fichier au format FITS contenant l’image. Celle-ci est monochrome et contient les pixels de la couche verte d’une photo couleur.
Matplotlib : permet d’afficher et de gérer l’interface homme-machine en très peu de lignes de code.

Programme très court, codé à la va vite, mais fonctionnel.

# -*- coding:Utf-8 -*-
"""
        Ouverture d'une image monochrome au format FITS
        Affichage des  éléments utiles sur l'image :
                dimensions, minimum, maximum et moyenne des pixels.
        Affichage de l'image en mode logarithme de façon à favoriser la vision,
                (mais sans modifier le tableau de données.)
        Sélectionner diverses étoiles en définissant un rectangle d'encadrement
        pour chacune.

        By : Lerautal -Automne 2017
"""
import numpy as np
import matplotlib
from matplotlib.widgets import RectangleSelector
import matplotlib.pyplot as plt
from astropy.io import fits
from matplotlib.colors import LogNorm

image_file = "vert.fit"
hdu_list = fits.open(image_file)
demi_cote = 10                # du carré encadrant le centre de l'étoile

image_data = hdu_list[0].data
print("Type d'image :",type(image_data))
print("Dimensions y et x : ",image_data.shape)
hdu_list.close()        # fermeture du fichier

def affiche_infos_image(td):
        """
                Affichage des données sur l'image
        """
        print('Valeur du pixel le plus faible :', np.min(td))
        print('Valeur du pixel le plus fort    :', np.max(td))
        print('Mean:', np.mean(td))
        print('Stdev:', np.std(td))
       
def coordonnees(click, relache):
        """  récupère le coin haut gauche du rectangle et le coin bas droite
        """
        x1, y1 = click.xdata, click.ydata
        x2, y2 = relache.xdata, relache.ydata
        mx =int(( x1 + x2) /2)
        my = int((y2 + y1) / 2)
        xdeb = mx - demi_cote
        xfin = mx + demi_cote
        ydeb = my - demi_cote
        yfin = my  + demi_cote
        somme = 0
        for i in range(ydeb,yfin):
                for j in range(xdeb , xfin):
                        somme = somme + td[i][j]

        print("Somme", somme, " centre : ", int(( x1 + x2) /2), int((y2 + y1) / 2))

"""
        A partir d'ici les données qui représentent l'image sont contenues
        dans un tableau appelé tableau_donnees
        Il s'agit d'un seul tableau à deux dimensions, l'image étant monochrome
"""


def activer_la_selection(event):
        """"
        En appuyant sur la lettre Q (ou q) on désactive la possibilité de
        sélectionner. En appuyant la touche A (ou a) on réactive cette possibilité
        """
        print('Action clavier')
        if event.key in ['Q', 'q'] and activer_la_selection.RS.active:
                print(' RectangleSelector deactivated.')
                activer_la_selection.RS.set_active(False)
        if event.key in ['A', 'a'] and not activer_la_selection.RS.active:
                print(' RectangleSelector activated.')
                activer_la_selection.RS.set_active(True)
        #~ if event.key in ['M', 'm'] and activer_la_selection.RS.active:
                #~ coordonnees(click, relache)
       

tableau_donnees = fits.getdata(image_file)
td = tableau_donnees
affiche_infos_image(tableau_donnees)
fig, current_ax = plt.subplots()                    

print("\n      click  -->  release")

"""
        Matplotlib peut afficher en grisé une image stockée dans un seul tableau
        à deux dimensions.
        L'image est affichée avec une représentation logarithmique, mais les données
        du tableau initial tableau_donnees ne sont pas affectées.
"""
plt.imshow(tableau_donnees, cmap='gray', norm=LogNorm())

activer_la_selection.RS = RectangleSelector(current_ax, coordonnees,
                                      drawtype='box', useblit=True,
                                      button=[1],  # seulement le bouton gauche
                                      minspanx=5, minspany=5,
                                      spancoords='pixels',
                                      interactive=True)
plt.connect('key_press_event',  activer_la_selection)

plt.show()

Plan du site Mentions légales Espace privé RSS

2009-2023 © Association Astronomique de l’Indre - Tous droits réservés
Haut de page
Réalisé sous SPIP
Habillage ESCAL 5.0.12