CARICATURER LES IMAGES "ASTRO"- 01
Une petite note par lerautal
1. POURQUOI CETTE FORMULATION ?
Nous allons maintenant commencer à effectuer des traitements sur une
véritable image astronomique. Mais qui dit traitement dit moyen de
constater le résultat.
Dans une première étape, où l'on doit "montrer ce qui se passe" le
procédé d'affichage du résultat va exagérer les choses, un peu comme un
caricaturiste qui exagère certains traits.
Un schéma qui résume ce que l'on va faire :
- Pour travailler sur les données, il faut les charger dans la mémoire
de l'ordinateur.
Dans le cas d'une image en 2 dimensions, les données (qui sont des
informations numériques) sont chargées dans un/des tableau(x) à deux
dimensions.
- La bibliothèque numpy offre
des possibilités efficaces de stockage et de traitement de ce type de
données.
- L'ensemble des traitements des données est effectué avec le langage
Python.
- Le résultat est alors restitué sous des formes adaptées, mais
incluant toujours une image.
2. UN EXEMPLE
L'image suivante est un petit détail de la photo d'Alcyone qui sert de fil
conducteur de ces chroniques. Elle ne comprend qu'une seule étoile... mais
aussi du bruit.
Elle a été largement agrandie :
La manipulation informatique qui va lui être appliquée est la suivante :
- Chacun des pixels va être comparé à une valeur qui sert de seuil.
S'il est inférieur à ce seuil, on "le jette".
- En utilisant les pixels qui restent, on réalise une image fictive,
où les pixels qui ont été gardés apparaissent sous la forme d'un petit
cercle bleu.
- Les valeurs possibles pour les pixels sont comprises entre 0 et
64000.
1. Le seuil est égal à 20000.
N'apparaissent que les pixels dont la valeur dépasse ce nombre.
Seul le centre de l'étoile apparaît.
2. Le seuil est égal à 5000.
On voit la forme globale de l'étoile mais aussi des pixels dont on se
demande ce qu'ils représentent.
3. Le seuil est égale à 3000.
Le bruit de fond est en train d'envahir l'image.
3. CONCLUSION PROVISOIRE
Nous venons de
montrer un premier
mode de traitement sur les images astro : l'élimination de certains
pixels... à partir de l'hypothèse qu'ils ne contiennent que du bruit.
L'étape suivante consiste à expliquer la structure et le code du programme
qui génère ces images.
4. LES BIBLIOTHÈQUES D'EXTENSION UTILISÉES
Bibliothèque pyfits :
Ouvre les fichiers au format FITS et charge les données sous forme de
tableaux numpy.
(prononcer
paille fitse)
Bibliothèque numpy :
Bibliothèque numérique apportant le support efficace de larges tableaux
multidimensionnels, et de routines mathématiques de haut niveau (fonctions
spéciales, algèbre linéaire, statistiques, etc.).
(prononcer num' paille)
Bibliothèque matplotlib :
Ensemble de fonctions pour tracer et visualiser des données. S'associe à
numpy.
5. STRUCTURE DU PROGRAMME QUI CRÉE LES IMAGES
6. CODE DU PROGRAMME QUI CRÉE LES IMAGES
Le code suivant n'exploite pas toute la subtilité du langage Python.
Mais il est d'une relecture assez simple.
0 |
# -*- coding:Utf-8 -*- |
définit l'alphabet "universel" |
1 |
# Nom : num_plot1.py
# Auteur : Lerautal - septembre 2015
# Ouvrir un fichier FITS
# Sélectionner les pixels dont la valeur est supérieure au seuil
# Créer une fonction pour charger les données
# Utilisation de matplotlib |
remarques |
2 |
import pyfits as pf
import numpy as np
import matplotlib.pyplot as plt |
bibliothèques d'extension |
3 |
# ---- constantes ----
Kseuil = 5800.0
# ---- variables ----
provis = [
]
# initialisation d'une liste vide
index =
0
# index des pixels dans provis
coordonnees = [ ] |
# initialisation d'une liste vide
# index des pixels dans provis |
4 |
# ---- zone des fonctions ----
def ouvre_et_recup_vert(nfic)
:
"Ouvre et ferme le fichier FITS récupère les
dimensions
ainsi que les
données pour le vert"
fic
= pf.open(nfic)
donnees =
fic[0].data
tailles = [
]
tailles =
donnees.shape
global largeur_image
global hauteur_image
largeur_image =
tailles[2]
hauteur_image =
tailles[1]
fic.close( )
return
donnees[1]
|
commentaire
ouvre les fichier
récupère les données
on récupère les dimensions
le tableau pour le vert est transmis |
5 |
vert = ouvre_et_recup_vert('etoile_seule.fit') |
on appelle la fonction |
6 |
provis = vert[vert > Kseuil]
lim_boucle = provis.size
print "nombre de pixels : ",lim_boucle
print 'Largeur : %s Hauteur : %s ' %
(largeur_image,hauteur_image)
plt.axis([0,largeur_image,0,hauteur_image])
while index < lim_boucle
: # on
positionne les points
coordonnees = np.where(vert==provis[index])
plt.plot(coordonnees[1],coordonnees[0],'bo')
index = index +1 |
provis = pixels > que le seuil
leur nombre
on affiche ce nombre
on affiche les dimensions de l'image
on crée la page pour afficher les points
on positionne les points dans l'image |
7 |
plt.show( ) |
on affiche l'image |
7. QUELQUES REMARQUES SUR LE CODE
Plutôt que de tout expliquer, ce qui ne satisfera personnes, voici
quelques points jugés importants.
Comment mettre en relation le code du
programme et les bibliothèque ?
import pyfits
as
pf
Le mot
import exprime le fait que la
bibliothèque pyfits devient accessible (on a repéré la boîte outils et on
l'a ouverte).
Le mot
as exprime le fait que le mot
qui suit (pf) servira à désigner la boîte à outil dans ce programme.
De façon approximative et imagée, pf est devenu le manche de tous les
outils de cette boîte.
Dans une page précédente, la clé associée à une lampe était désignée
comme un objet-outil.
Il était également dit que cet objet-outil pouvait être clôné.
Application :
fic = pf.open(nfic)
le "clone" pf dispose de l'outil open qui ouvre le fichier FITS et
l'associe à un nom symbolique (une sorte d'étiquette mettant permettant de
récupérer le contenu du fichier).
Ne garder que le tableau de données qui
contient la couleur verte
Le fichier contient trois tableaux à deux dimensions (hauteur et largeur).
Ces tableaux sont numérotés de 0 à 2 (cf le chef Algol d'une des pages du
site).
Le tableau 1 contient le vert.
En Python :
return donnees[1]
Ne garder que certains pixels du fichier
Ces pixels vont être mémorisés dans un tableau de nom symbolique
provis.
Tous les pixels sont contenus dans le tableau
vert[
]
provis contient tous les pixels de
vert[ pour
lesquels vert est supérieur au seuil
]
(par exemple si le seuil est de 5000 : un pixel valant 4000 sera écarté,
un autre valant 7000 sera retenu)
En Python avec numpy :
provis =
vert[vert > Kseuil]
Je trouve cette syntaxe très astucieuse.