À la découverte de PixelMath

Par Fred Denjean

Ce tutoriel a pour but de présenter et décrire l’outil qui fait des maths avec les images : PixelMath. Cet outil répond aux besoins des utilisateurs de pouvoir manipuler les images lors d’opérations plus ou moins complexes, comme s’ils manipulaient des variables mathématiques.

Quelques rappels sur les fichiers images

Les images que nous utilisons en astrophotographie peuvent être :

  • en couleur, on parle alors d’image RVB. Elles sont constituées, après prétraitement, de 3 canaux : le R, le V et le B. C’est le résultat de l’utilisation de la matrice de Bayer.
  • en noir et blanc. Il n’y a alors qu’un seul canal, représentant une nuance de gris.
Matrice de Bayer d’une image couleur.

Matrice de Bayer d’une image couleur.

Ce qu’il faut bien garder à l’esprit, c’est qu’une image RVB et une image Mono ne sont plus directement compatibles dans les formules de par leur structure.

PixelMath

  • Le fonctionnement de PixelMath est indépendant de tout autre processus en cours de réalisation, mais aussi de toute image ou séquence précédemment chargée.
  • Cependant, lorsque l’opération désirée est appliquée, le résultat est directement affiché dans la fenêtre de prévisualisation, prêt à être sauvegardé. Le nom proposé par défaut est ‘Résultat du Pixel Math.fits’.
  • PixelMath ne gère que le format FITS. C’est un choix. Il est donc inutile d’essayer de charger directement des TIFF par exemple. En revanche, Siril sait très bien lire ce dernier format, la solution est donc d’ouvrir le fichier TIFF, de le sauvegarder en FITS, de le PixelMath-iser, puis de sauver le résultat au format désiré.
  • Dans les formules applicables par Pixel Math, il faut garder à l’esprit que les images sont des variables comprises entre 0 et 1. Elles ne sont pas normalisées à 2n-1.
  • Le nombre maximal d’images utilisables simultanément est fixé à 10. Vous allez voir que c’est déjà bien.
  • Les images utilisables par PixelMath peuvent être linéaires ou non. Cependant, pour jouer en live avec les différentes couches, la version linéaire sera plus adéquate au niveau visuel.

Interface graphique

Voici une vue globale de l’interface :

Vue de l’interface PixelMath

Vue de l’interface PixelMath

  • zone 1 : Il s’agit ici de la composition de notre image, en 1 ou 3 canaux. Si l’image est au format RVB, seul le champ du haut (RVB/K) est accessible. Pour cela, la case “Utiliser une seule expression RVB/K” doit obligatoirement être cochée (sinon, un message d’erreur est affiché).
  • zone 2 : Permet d’ajouter une (ou des) image(s) ou de les retirer de la liste. Le + ouvre une fenêtre standard où la sélection multiple de fichiers est possible. Le - supprime de la liste la variable en surbrillance. Il est indispensable que les images à ajouter soient du même type (nombre de canaux) et de mêmes dimensions (LxW en pixels). Un message d’erreur est affiché sinon.
  • zone 3 : 3 boutons permettant de sauvegarder individuellement chacune des formules utilisées dans une bibliothèque interne (voir zone 9).
  • zone 4 : Liste des images utilisables, divisée en Variables (nom de variable modifiable par double clic) et Chemin (emplacement du fichier).
  • zone 5 : L’ensemble des fonctions utilisables est décrit plus loin.
  • zone 6 : L’ensemble des opérateurs aussi décrit plus loin.
  • zone 7 : Champ réservé aux paramètres (si utilisés). Voir plus loin.
  • zone 8 : Recentrage de la valeur des pixels de l’image par 2 coefficients (un pour les tons clairs, un pour les tons foncés).
  • zone 9 : La liste des fonctions sauvegardées.

Les fonctions et opérateurs

Les diverses fonctions sont quasiment toutes issues de la librairie standard. Les opérateurs peuvent être soit algébriques, soit logiques.

Les différentes fonctions et opérateurs. Une version PDF est disponible ici .

Les différentes fonctions et opérateurs. Une version PDF est disponible ici .

Un aide-mémoire au format PDF est téléchargeable ici .

La fonction spéciale “iif”

Cette fonction de test a la structure suivante :

iif(condition, expression_si_Vrai, expression_si_Faux)
  • condition est une expression logique portant sur un paramètre ou une variable.
  • expression_si_Vrai est alors le résultat retourné si le test est positif.
  • expression_si_Faux est alors le résultat retourné si le test est négatif.

Par exemple:

Prenons myPict1, une image 3 canaux (RVB donc).

Statistiques pour l’image RVB myPic1.fits

Statistiques pour l’image RVB myPic1.fits

On a ici R=[772.6, 65535], V=[977.5, 65535] et B=[698.3, 65535] (car l’image est en 16bit ici, donc max=65535).

Ou bien, écrit autrement, R=[0.018, 1], V=[0.015, 1] et B=[0.010, 1] (normalisé à 1).

En appliquant la condition suivante:

iif(myPic1>0.2, myPc1, 0.1)

Remise à l’échelle

En cochant Mise à l'échelle du résultat, tous les pixels de l’image seront modifiés (remis à l’échelle).

Par exemple,

Exemple de paramétrage de mise à l’échelle

Exemple de paramétrage de mise à l’échelle

Dans ce cas, la valeur minimale de chaque pixel sera de 6553.5 (0.1 x 65535), et la valeur maximale sera de 58981.5 (0.9 x 65535).

Nom des variables

Par défaut, les variables sont nommées I1 à I10, mais il est tout à fait possible de personnaliser ces noms, en double-cliquant dessus. Certaines règles doivent toutefois être respectées :

  • chaînes de caractères autorisées
  • chaînes alphanumériques autorisées
  • ne peut pas contenir que des chiffres
  • pas de caractères spéciaux, même au début, excepté pour _
  • pas d’espace
  • sensible à la casse

Voici un aperçu des combinaisons possibles :

Différentes syntaxes de variables autorisées

Différentes syntaxes de variables autorisées

$T, une variable très spéciale

Dans la boîte à outils PixelMath, une variable implicite peut être utilisée : $T. Cette variable pointe vers l’image actuellement chargée. Vous n’avez donc pas besoin de la déclarer dans la liste des images (zone 4).

Voici un test très simple pour comprendre le comportement de cette variable spéciale :

  • ouvrir une image, mono ou couleur.
  • taper 1-$T dans le champ RGB/K (zone 1). Cette opération simple fait passer une image en négatif, la valeur de chaque pixel est modifiée en son complément à 1.
  • À chaque fois que vous allez cliquer sur Appliquer, cette formule sera appliquée à l’image courante, en mémoire et ainsi l’image affichée sera inversée (vue en négatif).
Un test simple avec $T

Un test simple avec $T

Bien plus important : nommage automatique

Dans certaines conditions, le nom de chaque variable peut être automatiquement attribué de façon cohérente, pour faciliter l’identification et l’utilisation de chaque variable. Ceci est possible grâce à l’utilisation du champ FILTER= dans l’en-tête du fichier FITS.

Le champ FILTER dans le HEADER

Le champ FILTER dans le HEADER

Il y a plusieurs façons pour que ce champ soit automatiquement rempli :

  • avec un paramétrage correct de votre logiciel d’acquisition (NINA, APT, …). Dans ce cas, les valeurs de l’en-tête seront conservées au fur et à mesure des opérations de conversion/preprocessDOF/alignement/empilement. On peut ainsi trouver des valeurs comme CLS, LX pour les images couleurs, ou OIII, Ha, SII pour du mono. Il est fortement déconseillé d’utiliser tout caractère spécial, même si votre logiciel le permet. Cependant, le caractère spécial _ est autorisé.
Le champ FILTER dans le HEADER après NINA

Le champ FILTER dans le HEADER après NINA

  • Lors d’une extraction RVB, HaOIII, Ha ou OIII réalisée par Siril à partir d’une image couleur (OSC). Siril remplit alors le champ FILTER de l’en-tête avec la valeur adéquate.
Le champ FILTER dans le HEADER après un extractHaOIII

Le champ FILTER dans le HEADER après un extractHaOIII

Voici en images un exemple :

  • Une première image, dont le champ FILTRE est vide, subit une extraction RVB sous Siril.
  • On obtient alors 3 fichiers mono que l’on appelle r.fits, g.fits et b.fits.
  • Une seconde image, dont le champ FILTRE est FILTER=LX (par exemple pour L-Extreme), subit aussi une extraction RVB sous Siril.
  • On obtient alors 3 fichiers mono que l’on appelle rr.fits, gg.fits et bb.fits.

On importe alors les 6 fichiers mono pour comparer l’auto-naming.

La suite en vidéo.

Les paramètres

Tout comme en maths, ce sont des valeurs entières ou décimales, définies dans la zone 7. Ces paramètres peuvent être utilisés indifféremment dans n’importe quelle formule (RVB ou mono), ajoutant alors une souplesse à l’utilisation des formules.

Il s’agit ici de lister les paramètres utilisables dans les diverses équations.

Cette liste peut être de la forme :

k=0.7, P=3

La syntaxe :

  • Les différents paramètres sont séparés par une virgule
  • Le séparateur décimal est un point
  • Chaînes de caractères alphanumériques, minuscules ou majuscules, incluant n’importe quels caractères spéciaux sauf , et =.
  • Sensible à la casse

Pixelmath devient scriptable

Depuis la version 1.2.0 de Siril, l’outil Pixelmath devient utilisable dans les scripts mais aussi en ligne de commande.

La syntaxe générale est de la forme :

pm "expression" [-rescale [min max]]

Exemple basique d’utilisation dans un script :

Soient 2 images, image1.fits et image2.fits, toutes deux situées dans le répertoire de travail. La fonction suivante :

pm "$image1$ * 0.5 + $image2$ * 0.5" -rescale 0.0 0.9

aura pour effet de moyenner chaque pixel des 2 images, mais aussi de recentrer leurs valeurs dans la gamme [0.0 0.9].

Notez qu’ici la mise à l’échelle est optionnelle.

Quelques utilisations

Vous avez maintenant tous les outils pour utiliser PixelMath. Place à l’action avec quelques exemples :

Basiques

  • Exemple 1 : manipulation d’images RVB

Dans cet exemple simple, il s’agit d’importer une image RVB dans PixelMath, de lui appliquer un facteur et de vérifier le résultat.

  • Exemple 2 : Manipulation d’images Mono

Exemple similaire au précédent, mais avec un jeu d’images R, V et B. On ajoute en plus l’application d’un paramètre.

La formule appliquée,

k*R+~k*B

permet de générer une couche V synthétique après l’utilisation d’un filtre Dualband, par exemple.

  • Exemple 3 : Starless

Supposons que nous ayons une image RVB, ainsi que la version starless. Il est alors facile de générer le fichier “Stars”.

Avancées

  • Exemple 4 : Générer un pseudo masque (mono)

Dans cet exemple, on part d’une image RVB. Après extraction des canaux R, V et B, on va fabriquer le masque à partir du canal R en jouant sur son histogramme (le noir doit être très noir, et le blanc doit rester dégradé).

  • Une partie du masque est supprimée pour le rendre sélectif.
  • Le masque, qui est en mono, est appliqué via PixelMath aux 3 couches R, V et B, de façon à faire “monter” le rouge d’une partie de l’image.
  • L’image “locale” résultante est alors additionnée à l’image d’origine.

À vous de jouer maintenant !!!