14 June 2024

Tags: solex jsolex solaire astronomie

Dans ce billet, je vais prendre exemple d’un cas d’utilisation particulier, l’extraction d’images Hélium, pour expliquer comment j’envisage le développement de JSol’Ex, dans l’optique de simplifier, d’une version à une autre, son exploitation par les utilisateurs.

Je rappelle à toutes fins utiles que le logiciel officiel n’est pas JSol’Ex mais bien INTI de Valérie Desnoux.

Principe du Sol’Ex

Rappelons tout d’abord le principe de base du Sol’Ex de Christian Buil. Le concept requiert de reconstituer une image du soleil, ligne par ligne, en exploitant une vidéo dont chaque trame montre une partie du spectre solaire, centré sur une raie particulière que l’on étudie. La raie la plus communément étudiée est la raie H-alpha, qui, sur le spectre solaire, apparaît en absorption, c’est à dire qu’elle sera une ligne sombre sur une image du spectre :

spectre
Figure 1. Image du spectre solaire, raie H-alpha sombre détectée

En haut, l’image telle qu’on la trouve dans la vidéo, la ligne est "déformée". En bas, l’image "corrigée". Les points bleus correspondent à la détection de l’effet Doppler, les lignes sombres verticales correspondent à des taches solaires.

Les logiciels comme INTI et JSol’Ex exploitent le fait que la ligne étudiée est la plus sombre de l’image pour se repérer. Un des aspects fondamentaux de la reconstruction que je n’avais honnêtement pas compris lorsque je me suis lancé dans ce projet, c’est que tout le signal permettant de recomposer l’image H-alpha se trouve dans cette ligne sombre. En effet, même si elle paraît "noire", il y a en fait bien d’infimes variations dans cette ligne, et c’est celà qui nous sert à reconstituer une image !

Tip
8 bits vs 16 bits
Cet aspect explique l’importance d’utiliser une acquisition en 16 bits et non en 8-bits. En effet, si l’acquisition est faite en 8 bits, on ne dispose que de 256 valeurs possibles pour encoder l’ensemble de la dynamique de l’image. Si le signal ne se trouve qu’au centre de la raie, on comprend vite qu’on ne dispose alors que d’un nombre très limité de valeurs pour ce qui se passe dans cette simple région. En utilisant 16 bits, on augmente sensiblement notre capacité à encoder des valeurs de niveaux différents dans le centre de la raie, puisqu’on dispose cette fois de 65536 valeurs possibles pour l’ensemble de l’image !

Le cas des raies Hélium

La détection de raies sombres permet, si la fenêtre de cropping du spectre est relativement petite, de se concentrer sur une raie à étudier. Ca fonctionne très bien pour les raies H-alpha, Magnésium, Calcium K ou H, etc, qui sont des raies en absorption.

En revanche, la raie Hélium est une raie en émission : elle est "claire" au lieu d’être sombre, mais elle est aussi impossible à distinguer dans la plupart des trames parce que noyée dans le flux. Aussi les logiciels ne peuvent pas la trouver.

Alors, comment fait JSol’Ex, dans ses dernières versions, pour être capable de produire en 1 clic une image Hélium comme celle ci-dessous ? La question est intéressante non seulement d’un point de vue technique, mais aussi pour comprendre la façon dont j’aborde le développement de JSol’Ex.

image helium

Le site de Christian Buil est une nouvelle mine d’information pour nous aider : pour pouvoir produire une telle image, il est nécessaire de prendre une raie sombre comme référence, puis d’appliquer un "décalage de pixels" pour "trouver" la raie Hélium. Enfin, il est nécessaire de procéder à une soustraction du continuum (une 2ème image).

Cette notion de décalage de pixels est bien connue des utilisateurs chevronnés du Sol’Ex. Le principe est relativement simple : au lieu de reconstituer une image en utilisant le centre de la raie détectée (la ligne rouge dans l’image spectrale ci-dessus), on va reconstituer une image en se décalant vers le haut ou vers le bas de quelques pixels. C’est ce même principe qui permet de créer des images Doppler du soleil, qui montrent en bleu les régions qui s’approchent de nous et en rouge celles qui s’éloignent. On peut même produire des timelapses assez spectaculaires comme cette animation que j’ai réalisée le 5 juin 2024 et qui est générée par le logiciel en quelques minutes :


Comme Christian l’explique dans cette vidéo, trouver ce décalage de pixels n’est pas forcément chose simple. Tout d’abord, il est nécessaire de trouver la raie "sombre" de référence : on utilisera traditionellement le doublet du sodium pour se répérer, puis on utilisera la raie Sodium D2 ou encore la raie Fe I présente à côté comme référence.

Ensuite, il faut trouver ce fameux décalage de pixels pour "tomber" sur la raie Hélium. La vidéo de Christian ne montre pas les dernières améliorations que Valérie Desnoux a intégré à INTI pour rendre les choses plus simples, mais, grossièrement, il faut :

  • faire une capture surexposée qui va nous permettre de "voir" la raie hélium

  • faire une capture "normale" pour disposer de l’image à réellement traiter

  • ouvrir INTI et traiter la première vidéo pour disposer de l’image moyenne montrant la raie Hélium en bord de champ

  • traiter la 2ème vidéo en mode "raie libre", utiliser "polynôme automatique" et ouvrir l’image moyenne calculée lors du premier traitement pour trouver le décalage

  • enfin utiliser un autre logiciel comme i-Spec pour faire la soustraction

Cette procédure, bien que documentée, est très intimidante pour les utilisateurs et explique que peu se soient lancés dans ce défi.

Dans JSol’Ex, la procédure est simplifiée au maximum :

  • on fait une capture "classique", intégrant la raie de référence (ex SoD2) et en utilisant un cropping assez large pour intégrer aussi la raie proche Hélium

  • on ouvre le fichier dans JSol’Ex : les images sont générées automatiquement, il n’y a rien à calculer, pas de soustraction de continuum, rien, juste un clic !

Ca ne prend que quelques secondes !

Le processus de simplification

ImageMath

Avant d’en arriver là, il a fallu de nombreuses améliorations, qui ont été livrées au fur et à mesure des versions. La première, c’est ce système de script que j’ai appelé "ImageMath" (le nom est inspiré de PixelMath dans PixInsight) : il permet d’utiliser des scripts pour produire des images que JSol’Ex ne produit pas tout seul. Cette avancée a permis d’écrire un script qui produit une image Hélium à partir d’un seul fichier SER :

Un exemple de script permettant de générer une image Hélium
[params]
# Entrer la valeur du décalage de raie
RaieHelium = -85
# Limites hautes et basses pour le continuum
ContinuumLo=-80
ContinuumHi=-70
# Stretch de l'image
Stretch=10

## Variables temporaires
[tmp]
continuum = max(range(ContinuumLo,ContinuumHi))
helium_raw = autocrop(img(RaieHelium) - continuum)

## Maintenant les images !
[outputs]
helium = asinh_stretch(helium_raw, blackPoint, Stretch)
helium_fixed = asinh_stretch(fix_banding(helium_raw;BandWidth;BandIterations),blackPoint, Stretch)
helium_color = colorize(helium_fixed, "Helium (D3)")

Néanmoins, vous noterez que ce script nécessite toujours de déterminer le décalage de la raie Hélium, ainsi que la position du continuum. Ceci pouvait cependant être fait simplement avec le même fichier SER en l’ouvrant dans le "débogueur de raie", une procédure que je décrivais à l’époque dans une vidéo.

Cette procédure permettait ainsi d’obtenir une image Hélium en moins de 5 minutes, ce qui était déja une amélioration sensible par rapport à avant : plus besoin de faire 2 vidéos distinctes et un décalage de pixels calculé par le logiciel avec l’assistance de l’utilisateur.

Bien que ce soit une amélioration notable, on peut faire encore mieux.

Profils spectraux

JSol’Ex affiche depuis longtemps dans un onglet le "profil spectral" de l’image étudiée et peut aussi calculer la dispersion, mesurée en Angrstöms par pixel, d’une image. Ce profil correspond à l’intensité des raies pour un décalage de pixels donné. Depuis la version 2.3.0 cependant, j’ai intégré une fonctionnalité qui permet de détecter automatiquement la raie étudiée grâce à la comparaison de ce profil à un profil de référence (les données sont issues de la base de données BASS2000). Grâce à celà, il est désormais possible de savoir comment une image "s’aligne" entre le profil de référence et celui qu’on étudie. Puisque l’on connait à la fois la position de la raie de référence (Sodium D2 par exemple) et la dispersion, il est alors possible de calculer de combien de pixels on doit se déplacer pour trouver la raie Hélium !

Cette fonctionnalité est d’ailleurs disponible dans les scripts sous le nom de 'find_shift`.

Soustraction du continuum

A ce stade, nous disposons donc d’une image dont on sait qu’elle contient une raie de référence (Sodium D2 ou Fer Fe I) mais aussi le décalage en pixels de la raie Hélium. Il nous manque cependant la soustraction du continuum. Là encore, le script ci-dessus montre qu’il fallait entrer une valeur "à la main" pour trouver ce qu’il fallait soustraire. Une façon simple de procéder était encore une fois d’ouvrir le débogueur et de regarder les lignes plus claires dans le spectre : l’oeil étant assez sensible aux changements de contraste, il n’était pas trop compliqué de trouver un intervalle raisonnable pour le continuum.

Néanmoins, si on souhaite arriver à un traitement complètement automatique, on ne peut plus se baser sur une valeur "pifométrique". Une façon naïve de régler le problème aurait été d’utiliser un décalage fixe (par exemple 15 pixels). Cependant, ça ne fonctionne pas, pour plusieurs raisons :

  • le décalage dépend de la résolution (taille des pixels, dispersion)

  • on peut tomber sur une raie trop sombre, cette région du spectre étant assez contrastée

  • le résultat est très sensible à l’exposition

Pour cette raison, j’ai ajouté une fonctionnalité qui calcule un "continuum synthétique".

Il faut noter que contrairement à l’image "continuum" qui utilise un décalage fixe (et configurable) dans les traitements standards, ce continuum synthétique est utilisé uniquement dans le contexte du traitement Hélium, ou lors de l’utilisation de la fonction continuum() dans un script.

L’idée de cette fonction est de calculer une image qui représente au mieux le continuum à soustraire. Au lieu d’utiliser un seul décalage de pixels, on va effectuer un calcul à partir de plusieurs décalages (cette fonction nécessite donc plus de ressources lors du traitement). Ainsi la première chose à comprendre c’est qu’il ne s’agira pas d’une image à une longueur d’onde précise, mais bel et bien d’une image synthétique basée sur des propriétés statistiques.

En premier lieu, on effectue un échantillonnage des images à différents décalages de pixels, du minimum possible au maximum possible par rapport à la fenêtre de cropping du spectre et de la distorsion. Par exemple, si chaque trame fait 2000x200 pixels, on dispose potentiellement de 100 décalages entiers (la hauteur de l’image). Cependant, à cause de la distorsion, seuls un sous-ensemble nous permet d’avoir des lignes complètes lors de la reconstruction (disons, 180 lignes, qui donneront 180 images). Sur ces 180 décalages possible, nous n’allons, pour des raisons de performance, uniquement en retenir un échantillon (environ 1/3), ce qui nous donnera donc 60 images à étudier. Sur ces 60 images, on élimine celles qui correspondent à un décalage de pixel trop proche de la raie de référence puisque de manière évidente elles ne correspondent pas au continuum.

Dès lors commence l’analyse statistique : pour chacune de ces images, on calcule leur valeur moyenne. Ensuite, nous calculons la moyenne de ces moyennes et nous ne conservons que les images dont la moyenne est supérieure à cette moyenne.

A ce stade, il nous reste donc quelques candidates, dont la luminosité est suffisante pour être considérée comme le continuum, mais on dispose bien d’une liste d’images. La dernière étape consiste donc à calculer la médiane de toutes ces images, pour obtenir un et un seul "continuum synthétique".

Si on reprend les étapes, celà nous donne par exemple:

  • on dispose de 60 images à des décalages de pixels (entiers)

  • on retire les 8 qui sont au centre de la raie étudiée, il en reste 52

  • on calcule la valeur moyenne de chacune de ces images : 5000, 8000, 5200, 6400, …​

  • on calcule la moyenne de toutes ces moyennes, par ex: 6000

  • on ne retient que les images dont la moyenne est supérieure à cette moyenne, disons qu’il en reste 30

  • on calcule la médiane de ces 30 images

Il ne nous reste donc plus qu’à faire la soustraction entre l’image au décalage de pixels de la raie Hélium avec le continuum synthétique calculé et on obtient l’image Hélium ci-dessus, en quelques secondes seulement !

Conclusion

Dans ce billet, j’ai décris la façon dont je procède pour améliorer JSol’Ex. En premier lieu, il s’agit d’identifier un besoin particulier, par exemple, ici, produire une image Hélium. A partir de ce besoin, il s’agit de chercher comment simplifier un tel traitement. La simplification ne se fait alors qu’à partir de ce dont je dispose à un instant t. Par exemple, dans un premier temps, il a s’agit d’ajouter un système de scripts, qui, outre le traitement des images Hélium, permet d’exploiter la richesse des données disponibles dans un scan. Les personnes intéressées peuvent en apprendre plus sur les scripts dans ce tutoriel.

Ensuite, il a s’agit d’ajouter des fonctionnalités permettant de simplifier la configuration pour les utilisateurs, en l’occurrence la détection automatique de raie, puis d’exploiter ces nouvelles fonctionnalités pour simplifier encore plus le traitement des images.

Ainsi, il s’agit d’une méthode très itérative, mais toujours dans le but de livrer des incréments fournissant une certaine valeur ajoutée aux utilisateurs. La bonne nouvelle, c’est que j’ai beaucoup d’autres idées en tête !

Ressources

  • JSol’Ex (téléchargement et documentation)

  • INTI (logiciel officiel)

  • Sol’Ex (site officiel Sol’Ex)