From madore@clipper.ens.fr Fri Aug  9 04:29:13 2002
Article: 2 of ens.forum.informatique.graphisme
Path: eleves!not-for-mail
From: madore@clipper.ens.fr (Gro-Tsen)
Newsgroups: ens.forum.informatique.graphisme
Subject: prolegomenes : luminosite, contraste et correction gamma
Date: Fri, 9 Aug 2002 02:29:13 +0000 (UTC)
Organization: Forum.
Lines: 172
Sender: madore@clipper.ens.fr
Message-ID: <aiv9dp$atu$1@clipper.ens.fr>
NNTP-Posting-Host: clipper.ens.fr
X-Trace: clipper.ens.fr 1028860153 11198 129.199.129.1 (9 Aug 2002 02:29:13 GMT)
X-Complaints-To: forum@clipper.ens.fr
NNTP-Posting-Date: Fri, 9 Aug 2002 02:29:13 +0000 (UTC)
X-Newsreader: Flrn (0.5.0pre0 - 10/00)
X-Start-Date: 09 Aug 2002 00:20:16 GMT
Xref: eleves ens.forum.informatique.graphisme:2

J'inaugure ce conti en vous racontant des choses que j'ai mis un
certain temps à comprendre, et qui peut peut-être vous intéresser si,
comme moi, vous aviez les idées assez floues sur le sujet.

En particulier sur le sens de ces mystérieux réglages « luminosité »
et « contraste » sur un moniteur et sur le sens de l'expression
« correction gamma ».  Pour l'instant je parle uniquement d'écrans
noir et blanc (enfin, ça n'existe plus, mais disons que je ne me
préoccupe pas des spécificités de la couleur) : le seul paramètre est
donc la luminosité émise en un point donné.  (Je parle aussi d'écrans
cathodiques - je ne sais pas ce qu'il en est pour les LCD.)

La première nouvelle, c'est que ce n'est pas le bouton « luminosité »
qui sert à régler la luminosité, c'est le bouton « contraste ».  Ce
réglage a pour effet d'ajuster la luminosité maximale émise par
l'écran ; il le fait de façon linéaire en ce sens que si on change le
réglage de contraste pour diviser par deux la luminosité maximale, on
divise par deux toutes les autres luminosité, donc on ne change pas le
contraste de l'image (malgré le nom du réglage).  (En revanche, je
n'affirme pas, si le bouton est calibré ou s'il s'agit d'une barre de
défilement dans un menu de l'écran, que ce soit linéairement en
l'intensité maximale.)

Dans ces conditions, on peut se demander à quoi sert le bouton
« luminosité », s'il ne règle pas la luminosité.  En fait, il sert à
calibrer le « point noir » de l'écran, c'est-à-dire l'intensité émise
en un point que le moniteur considère comme noir.  Plus précisément,
le bouton « luminosité » effectue une translation du signal reçu par
le moniteur : donc augmenter ce réglage remplace le noir par un gris
sombre ; au-dessous d'un certain niveau, le réglage de la luminosité
va tronquer les gris sombres et tous les égaliser sur le noir.

Maintenant, en principe, on voudrait que le noir soit noir.  Sur la
plupart des moniteurs cela signifie qu'il faut régler la
« luminosité » au *minimum*.  Sur certains moniteurs, cela tronque les
gris sombres, et il faut donc, en fait, le régler sur le maximum pour
lequel le noir est parfaitement noir.  Bon, si on n'est pas puriste,
on peut augmenter un tout petit peu ce réglage de la « luminosité »,
cela aide à diminuer les effets désagréables de la réponse
non-linéaire (cf. la correction gamma, ci-dessous), et cela permet
d'éclairer un peu plus si le réglage du contraste ne va pas assez haut
(ce qui est malheureusement fréquent) ; mais surtout il ne faut pas
monter trop haut.

La méthode pour un bon réglage d'un moniteur (en tout cas un réglage
précis s'il s'agit de voir des images) est donc la suivante.
Commencez par vous plonger, autant que possible, dans l'obscurité
complète, et réglez le bouton « contraste » au maximum et le bouton
« luminosité » au minimum.  Visualisez un écran noir.  Puis augmentez
*lentement* le réglage « luminosité » jusqu'à ce que le fond ne soit
plus noir (l'idéal, c'est, si le faisceau ne balaie pas la totalité de
l'écran, de comparer la région balayée avec la région non balayée :
elles ne doivent pas différer).  S'arrêter juste au moment où la
moindre augmentation provoquera une différence (le noir ne sera plus
noir).  Souvent cela signifie s'arrêter dès le début, i.e., régler la
luminosité au minimum.  Une fois ce réglage effectué, ne plus y
toucher.  Mettre l'écran dans ses conditions d'éclairage ambiant
normales (idéalement, un environnement assez sombre mais pas
complètement noir), visualiser une image comportant un contraste
important (notamment du blanc pur et du noir pur), et ajuster le
bouton « contraste » pour que l'image affichée soit bien visible mais
pas trop lumineuse.

(Note : le bouton « luminosité » est celui sur lequel on trouve un
logo représentant un soleil - un petit cercle entouré de huit rayons ;
le bouton « contraste » est celui sur lequel on trouve un logo
représentant un disque moitié blanc et moitié noir.  Bien entendu, je
parle de « boutons », mais il peut s'agir de réglages dans un menu
intégré ou de plein d'autres choses.)

Si V est la valeur du réglage « contraste » dans des unités
arbitraires (linéaires dans l'intensité) et D la valeur de la
« luminosité » (également dans des unités arbitraires), enfin x la
valeur du signal d'entrée pour un pixel donné (dans les mêmes unités
que D ; positif ou nul), l'intensité émise est censément donnée par la
formule

			  V·max(x+D,0)^gamma

où gamma vaut environ 2.2 (certains disent 2.4 ou même 2.5, mais c'est
probablement parce qu'ils tiennent compte d'une réponse pas tout à
fait linéaire de l'oeil).  Pour le réglage idéal décrit ci-dessus, on
a D=0, auquel cas la formule se ramène à

			      V·x^gamma

Le problème est que ce n'est pas linéaire.  Les moniteurs pourraient
très bien compenser en interne, mais ce n'est pas cette solution qui a
été retenue, historiquement (une décision qui s'avère assez
catastrophique).

Quasiment toutes les cartes graphiques pour PC ou Sun n'appliquent pas
de « correction gamma ».  Autrement dit, la mémoire vidéo est
directement transmise aux DAC (convertisseurs digital->analogique) qui
déterminent x dans la formule ci-dessus.  En clair, si vous affichez
la couleur 128 sur 255, avec un bon réglage du point noir, vous
obtenez une intensité qui est 22% (et non 50%) du blanc le plus
intense (255 sur 255).  Et la couleur 1 sur 255 est à peu près
impossible à distinguer du noir pur.  Les Macs appliquent (par défaut)
une correction gamma de 1.4, c'est-à-dire que la valeur du pixel est
élevée à la puissance 1/1.4 avant d'être transmise au moniteur, et il
reste un facteur gamma effectif de 2.2/1.4 soit environ 1.6.  Les
Silicon Graphics appliquent, eux, par défaut, une correction gamma de
1.7, ce qui laisse un facteur gamma du système de 2.5/1.7 soit environ
1.3.  Enfin, les NeXT appliquent une correction gamma de 2.2 censé
annuler complètement la non-linéarité de la réponse du moniteur.

Cela signifie que si vous prenez une image « non étiquetée », disons
une image GIF, qui représente une photo, et que cette image apparaît
correcte sur un PC (ce qui sous-entend que les valeurs des pixels
comportent une correction gamma de 2.2, autrement dit qu'on stockera
128/255, par exemple, pour signifier un gris de 22%), alors elle
apparaîtra trop blanche sur un Mac, et encore plus sur un SGI.  Et une
image non étiquetée qui apparaît correcte sur un Mac apparaîtra trop
sombre (trop contrastée) sur un PC et trop blanche (trop délavée) sur
un SGI.

Pour compenser ce problème, certains formats d'image, par exemple PNG
et (je crois, mais c'est plus compliqué) JPEG, permettent
l'étiquetage : on attache à l'image la valeur de la correction gamma
déjà appliquée, et un système chargé de l'afficher va appliquer la
correction résiduelle (ou compenser la correction déjà appliquée) pour
afficher correctement en fonction du facteur gamma effectif du
système.

Une autre chose à laquelle il faut faire attention, c'est que toutes
les opérations de traitement d'image doivent se faire, pour être
correctes, sur des images *non* gamma-corrigées (i.e. à échantillons
linéaires).

Du coup, n'importe quel traitement d'image effectué par Gimp sur un PC
est foireux : comme Gimp n'a pas de module pour afficher l'image avec
une correction gamma sans la stocker dans l'image elle-même, si vous
voyez l'image correctement sur votre PC, c'est qu'elle est
gamma-corrigée, et une manipulation d'image effectuée dessus va
provoquer des erreurs de non-linéarité (en clair : si vous appliquez
une transparence de 50% à un blanc pur au-dessus d'un noir pur, vous
obtenez un gris à 22% au lieu d'un gris à 50%).  Vous ne pouvez pas
non plus vraiment vous en sortir en défaisant la correction gamma le
temps de manipuler l'image puis en la refaisant à la fin - parce que
vous allez perdre plein d'information comme ça dans les arrondis au
cours de l'opération.  Apparemment ça n'a pas l'air de gêner les
développeurs de Gimp - passons.

(Notons que Gimp a ce qu'il faut pour changer une correction gamma ou
appliquer un facteur gamma : dans Colors > Levels, le 2e chiffre, ou
niveau de gris, est la correction gamma à appliquer.  Donc, si vous
voulez manipuler une image qui s'affiche bien sur votre PC, modulo les
erreurs d'arrondi que ça va provoquer, il faut d'abord utiliser
l'outil en question pour appliquer un facteur gamma de 0.45, traiter
l'image, puis utiliser de nouveau l'outil pour remettre un facteur
gamma de 2.2.)

Le gros problème avec toute cette histoire de gamma, c'est qu'on ne
sait jamais ce qu'il en est.  Par exemple, un appareil photo numérique
ne vous dit pas, dans le manuel, quel est son facteur gamma.  J'ai
fait des expériences (à savoir : photographier l'écran de mon PC dans
le noir et étudier la courbe de réponse) avec le mien (Minolta
Dimage X) qui *sembleraient* impliquer qu'il faut appliquer un facteur
gamma d'environ 1/1.8 aux images produites avant de les afficher sur
un écran de PC pour obtenir un rapport linéaire entre l'intensité
reçue par l'appareil et l'intensité émise par le moniteur qui les
affiche (cela signifierait donc que le pixel indiqué par l'appareil a
un exposant 1.8/2.2=0.81 par rapport à la lumière reçue ; mais c'est à
prendre avec beaucoup de pincettes).  Il est possible que les images
JPEG sauvegardées indiquent le facteur gamma, mais je ne sais pas l'en
extraire.

Question grotesquitude : quand on sauvegarde un PNG avec Gimp, il
propose une option « save gamma factor » ou quelque chose comme ça.
Mais on n'a aucun moyen de lui dire quel facteur gamma sauvegarder,
justement !  D'où sort-il ce chiffre ?

