
Un petit programme qui, en utilisant la souris, permet de faire la somme des valeurs des pixels d’une étoile (ou du fond)
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é.
- 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.
- 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()