La colormap Jet

La célèbre colormap (l'ensemble des couleurs de l'image) par défaut de Matlab, jusqu'à la version 2014b, se nomme "Jet" - on trouve aussi comme nom "Rainbow" ailleurs. Il s'agit d'un dégradé arc-en-ciel partant du bleu vers le rouge en passant par le vert. colorbar.png

La colormap "Jet"

Cela donne par exemple l'image ci-dessous, qui va servir d'exemple par la suite: doublepeak_jet.png

Une image avec des doubles pics, utilisant la colormap "Jet"

Visuellement, cette colormap est très jolie, mais elle présente pas mal de défauts, constatés par de nombreux auteurs.

D'abord, elle n'est pas adaptée à toute une frange de la population, les daltoniens. Le graphique ci-dessous, produit par l'éditeur de Matlab lui-même, montre que pour les proteranope et les deutéranopes, la valeur extrême rouge apparait noire, tandis que le blanc correspond à une valeur intermédiaire peu précise. colormap_daltoniens_short.png

La colormap "Jet" vue par des personnes atteintes de différentes formes de daltonisme

Cette colormap ne tient d'ailleurs pas bien la conversion en niveaux de gris. Cela peut paraitre anecdotique, mais les impressions d'image, notamment d'articles, se font souvent en noir et blanc : il est dommage de perdre des informations cruciales par ce biais. Ainsi, l'image précédente convertie en niveau de gris transforme les valeurs extrêmes en un même noir : le maximum et le minimum ont la même apparence ! doublepeak_NB.png

Apparence de l'image avec les doubles pics, utilisant la colormap "Jet" mais mprimée en noir et blanc.

Enfin, et c'est là la principale critique formulée par les chercheurs, c'est que cette colormap induit des biais, dus aux imperfections de la vision humaine y compris les non daltoniens. Le rouge, par exemple, apparait beaucoup plus "lumineux" que le bleu, à luminance égale. Ceci est surtout dû à des millions d'années de survie dans la nature qui ont fait que l'oeil était plus sensible à certaines couleurs comme le rouge.

Bref, cela fait qu'un pic "positif" en rouge sera beaucoup plus visible qu'un pic "négatif" en bleu, sans même parler de cette horrible couleur verte pour la valeur 0, mais bon, passons) . J'ai représenté ci-dessous l'image précédente, mais avec un pic négatif plutôt que positif. invertedpeaks_jet.png

Une image avec des deux pics inversés, utilisant la colormap "Jet"

Les ingénieurs de Matlab ont essayé de corriger ce défaut, mais la solution a rendu en fait les choses pires : les valeurs extrêmes sont plus sombres que les autres ! Ainsi, les valeurs les plus lumineuses correspondent au turquoise et au jaune, des valeurs intermédiaires. Ainsi, sans une longue habitude de cette colormap, il n'est pas facile de réussir à classer les valeurs dans l'ordre. Voici un petit jeu, à titre d'illustration : sans avoir la colorbar proche, pensez vous pouvoir classer les valeurs ci-dessous par ordre croissant ? colorbar_temp.png

(réponse à la fin du billet)

Bref, cette barre de couleur est loin d'être idéale. Mais par quoi la remplacer ?

Les autres colormaps par défaut de Matlab

Voyons ce que l'on peut trouver par défaut dans Matlab: colormap_matlab.jpg

Liste des colormaps par défaut de Maltab (version supérieure à R2014b)

Elles sont nombreuses. La première dans la liste, "Parula", a été introduite récemment dans Matlab pour remplacer "Jet".

On peut classer les colormaps selon 4 catégories :

    • 1) Les colormaps "séquentielles", composée de "Hot", "Cool", "Autumn", "Summer", "Spring", "Winter", "Gray", "Bone", "Copper", "Pink", auquel on peut éventuellement ajouter "Jet"
        2) Les colormaps "divergentes", composée de "Jet"
        3) Les colormaps "continues", où le maximum et le minimum ont la même luminosité (dénomination personnelle), essentiellement "HSV"
        4) Les colormaps "aléatoires", constituée uniquement de "Lines"

      Passons rapidement sur cette dernière catégorie : il s'agit simplement de couleurs très différentes d'une valeur à l'autre, car on ne cherche pas à classer les valeurs entre elles, mais juste de les distinguer.

      De même, la catégorie divergente est uniquement composée de "Jet", avec les défauts constatés précédemment. On verra par la suite qu'on peut faire mieux.

      La colormap continue

      La colormap continue sert à représenter une valeur qui boucle, par exemple la phase d'un signal où les valeurs à t et t +2 π sont censées être identiques. Cette colormap, bien utilisée, permet d'éviter une discontinuité entre le maximum et le minimum, qui sont censés se suivre. A titre d'exemple, voici l'image précédente avec une discontinuité (j'ai simplement soustrait 1.5 aux valeurs supérieures à 0.5) : wrappedpeaks_jet.png

      Image des pics inversés, avec une discontinuité, en utilisant la colormap "Jet"

      En utilisant la colormap "HSV", la discontinuité disparait : wrappedpeaks_hsv.png

      Image des pics inversés, avec une discontinuité, en utilisant la colormap "HSV" : la discontinuité est maintenant invisible

      Malheureusement, même si la discontinuité a disparu, le résultat souffre des mêmes défauts que "Jet" : on a bien du mal à voir comment les valeurs se suivent, surtout quand la figure est complexe !

      La colormap séquentielle

      Enfin, les colormaps séquentielles sont les plus nombreuses. La meilleure est probablement "Gray" : facile à interpréter, compatible avec tous les défauts de daltonisme, luminosité progressive, et bien évidemment compatible noir et blanc. Il est cependant difficile de différencier des faibles variations - l'oeil humain est capable de distinguer au mieux une trentaine de niveaux de gris - et surtout d'être peu attractif à l'oeil, beaucoup moins que les couleurs. Les colormaps "bone", "copper" et "pink", quasiment similaires, restent d'ailleurs globalement peu utilisées (à part quelques applications spécifiques comme, "Bone" pour les images par rayon X, pour des raisons historiques). doublepeak_gray.png

      Image des doubles pics, en utilisant la colormap "Gray"

      La colormap "Hot" est également plutôt bien, facile à interpréter également : il est aisé de classer les valeurs de cette colormap. Elle présente même l'avantage d'être compatible avec la vision des daltoniens ! doublepeak_hot.png

      Image des doubles pics, en utilisant la colormap "Hot"

      Les autres sont moins utilisées, et à raison, car elles n'offrent pas une grande variation : une variation du rouge vers le jaune, comme dans "Autumn", est trop faible. doublepeak_autumn.png

      Image des doubles pics, en utilisant la colormap "Autumn"

      Dans l'ensemble, le choix est donc très limité, mise à part pour les séquentielles (et encore, pour ces dernières, il n'y a guère que "Gray" et "Hot" qui sont vraiment utiles).

      Et pour référence, voici un tableau complet des colormaps et de leur compatibilité avec le daltonisme : colormap_daltoniens.png

      Ensemble des colormaps de Matlab telles que vues par les daltoniens (source)

      Y a-t-il mieux ?

      Oui ! Mais avant d'en utiliser une, mieux vaut prendre un instant pour identifier ce que vous souhaitez représenter exactement. (Note : vous pourrez retrouver toutes les colormaps présentées ici à la fin de ce billet).

      Colormaps séquentielles

      La nouvelle colormap de Matlab, "Parula", est bien adaptée comme colormap séquentielle: doublepeak_parula.png

      Image des doubles pics, en utilisant la colormap "Parula"

      Il existe aussi le pendant "froid" de "Hot", nommé "Ice" : doublepeak_ice.png

      Image des doubles pics, en utilisant la colormap "Ice"

      Ainsi qu'une variante, appelée "Dawn" (proche de "plasma") : doublepeak_dawn.png

      Image des doubles pics, en utilisant la colormap "Dawn"

      Ces trois colormaps partagent à peu près les mêmes qualités, donc vous pouvez les utiliser selon vos goûts et selon les expériences.

      Colormaps divergentes

      Les colormaps présentées ci-dessous servent à représenter une valeur centrale ainsi l'écart par rapport à cette valeur. Souvent, il s'agit d'une valeur centrale nulle, et de valeurs positives et négatives. Le choix va dépendre de ce que vous voulez mettre en valeur : les écarts, ou la valeur centrale ?

      On peut ainsi combiner de manière amusante "Hot" et "Ice", ce qui donne "Fireice" que j'aime bien : doublepeak_fireice.png

      Image des pics inversés, en utilisant la colormap "Fireice"
      La luminosité est nulle au centre, et augmente lorsque l'on va dans les extrêmes.

      Une petite variante que j'aime beaucoup aussi est inspirée des colormaps utilisées en imagerie Doppler : doublepeak_dopplermap.png

      Image des pics inversés, en utilisant la colormap "Dopplermap"

      Si vous souhaitez au contraire plutôt mettre en avant la valeur centrale, la colormap "Centralmap" diminue la luminosité des extrêmes (rouge/vert) et augmente celle de la valeur centrale (jaune vif) : invertedpeaks_centralmap.png

      Image des pics inversés, en utilisant la colormap "Centralmap" : la valeur centrale apparait nettement, tout en étant capable de distinguer les valeurs de part et d'autres de cette valeur centrale

      La colormap "Bluewhitered", qui comme son nom l'indique passe du bleu au rouge en passant par le blanc, est plus connue. La luminosité est maximale au centre, et diminue progressivement lorsqu'on s'en éloigne : doublepeak_bluewhitered.png

      Image des pics inversés, en utilisant la colormap "Bluewhitered"

      Colormaps continues

      Les colormaps continues sont plus difficile, et "HSV" est peut-être la seule solution rigoureusement possible basée uniquement sur des variations de couleurs, qui n'autorise pas 2 valeurs différentes à avoir 2 couleurs identiques. J'ai testé la barre ci-dessous, qui est une dégradé de blanc à gris puis de gris à blanc en passant par 2 couleurs différentes (turquoise ou orange), mais bon, ce n'est pas très plaisant à l'oeil. Néanmoins, la discontinuité n'est pas visible, ce qui est le but recherché. wrappedpeaks_wrap.png

      Image des pics inversés, avec une discontinuité, en utilisant la colormap "wrap" : on ne voit pas la discontinuité, tout en étant capable de classer les valeurs

      Superposer deux images

      Si on veut superposer deux images, par exemple, comment faire ? Cela se fait notamment en échographie, où on superpose à l'image échographique, en noir et blanc, des informations supplémentaires, comme une vitesse de déplacement des tissus (imagerie Doppler) ou une élasticité (élastographie). Les colormaps se doivent alors d'être très différentes pour éviter de les confondre.

      D'expérience, j'ai remarqué qu'un fond en niveaux de gris et une image du dessus en couleur, légèrement transparente, est ce qui rend le mieux. Une chose qui rend particulièrement bien est le fait de rendre une couleur de l'image du dessus transparente. Dans le cas de la colormap "hot" ou "ice", on retirera la couleur noire, avec un seuil variable selon ce que l'on veut observer. Si l'image du fond est plutôt sombre, on peut utiliser des colormaps séquentielles ou divergentes qui passe par une couleur sombre, comme "hot", "ice", "fireice" ou "dopplermap". Si l'image du fond est plutôt claire, on peut à l'inverse prendre "bluewhitered".

      Une image doppler (en couleurs) superposée à une image ultrasonore (en noir et blanc) (source)

      Un outil pour réaliser ses propres colormaps

      Le site internet suivant est très bien fait pour réaliser ses propres colormaps : Custom Colormap Je l'ai d'ailleurs utilisé à plusieurs reprises pour faire les colormaps de cet article.

      Essayez-le, c'est un excellent outil !

      Références

      Vous pouvez retrouver les colormaps ci-dessus en fichiers matlab directement utilisables grâce aux fichiers ci-dessous. Placez-les simplement dans un dossier auquel Matlab a accès (via un PATH), et vous pouvez simplement les utiliser grâce à la commande "colormap fireice" (si vous voulez utiliser fireice, par exemple). Vous pouvez aussi utiliser les colormaps dans d'autres logiciels en ouvrant ces fichiers avec un simple éditeur de texte et en copiant la matrice de 256 valeurs (composées de 3 colonnes avec les composantes rouges, vert et bleu).

      PS : La solution pour l'ordre des couleurs, en haut, est 5-1-6-2-7-4-9-8-3
      PPS : Je remercie le Dr Damien Garcia pour m'avoir fourni la colormap "Dopplermap"