RFC: 2083
Statut : Proposition
Retour à l'index des normes : INDEX FRANCAIS

PORTABLE NETWORKS GRAPHIC 1.0

SPECIFICATION



Crédits : Thomas Boutell / Boutell Com Inc
Traduction : V.G. FREMAUX

Précédent - Introduction aux couleurs - Retour au sommaire

AP1. Appendice : Gamma

(Cet appendice ne fait pas partie de la spécification PNG).

Il serait idéal, pour les programmeurs d'applications graphiques, que tous les composants de la chaîne graphique soient linéaires. Dans une telle situation idyllique, la tension de sortie d'une caméra serait alors directement proportionnelle à l'intensité de la lumière (puissance) d'une scène, la lumière émise par un tube cathodique serait directement proportionnelle à sa tension d'entrée, etc. Malheureusement, les équipement réels ne se comportent pas de cette façon. Tous les écrans, presque tous les films photographiques, et de nombreuses caméras ont des caractéristiques intensité/tension ou tension/intensité non linéaires.

Malgré tout, tous ces éléments non linéaires ont néanmoins des fonctions de transfert qui peuvent être modélisées par une fonction mathématique assez simple: une fonction puissance. Cette fonction est d'équation générale :

output = input ^ gamma

^ symbolise la mise à la puissance, et "gamma" (souvent symbolisé par le symbole grec de même nom) est tout simplement l'exposant.

Par convention, l'entrée "input" et la sortie "output" sont toutes deux calibrées sur l'intervalle 0..1, 0 représentant le noir et 1 représentant l'intensité de lumière blanche maximale (ou rouge, ou verte, ou bleu si l'on ne considère qu'une composante primaire). Ainsi normalisée, cette fonction puissance est décrite complètement par un seul nombre : l'exposant "gamma".

Ainsi, pour un élément particulier de la chaîne, nous pouvons mesurer la sortie comme une fonction de son entrée, assimiler cette fonction à une fonction théorique de puissance, extraire l'exposant, et l'appeler gamma. Nous dirons alors "cet élément a un gamma de 2,5" comme raccourci de "cet appareil a une réponse selon une puissance d'exposant 2.5". Gamma peut être aussi vu comme une transformée mathématique, ou comme une table de transfert agissant sur le tampon graphique d'affichage, pour autant que l'entrée et la sortie de l'objet visé réponde à une fonction de type "puissance".

Comment les gamma se combinent ?

Une chaîne graphique réelle est composée de nombreux éléments, dont un certain nombre peuvent être non linéaires en réponse. Si tous les composants avaient une fonction de transfert de type puissance, alors la fonction de transfert de l'ensemble de la chaîne serait une fonction de type puissance. L'exposant (gamma) de la chaîne est alors le produit de tous les exposants (gammas) de chaque élément séparé du système.

Dans ce contexte, les éléments linéaires s'intègrent sans problème, dans ce sens que l'exposant d'un système linéaire est 1,0 , cas particulier de notre fonction de puissance.

Ainsi, tant que notre système n'est composé que d'éléments linéaires, ou non linéaires à loi de type puissance, alors il est raisonnable de parler de gamma du système, obtenu par produit de tous les gamma de chaque composant.

Quelle valeur devrait prendre le gamma d'un système complet ?

Si le gamma global d'un système graphique vaut 1, sa restitution est une fonction linéaire de son "excitation" (ou sa sortie est une fonction linéaire de son entrée). C'est à dire que les rapports d'intensité entre toutes les zones d'une image sont conservées comme dans la scène originale. Il semblerait que ce but devrait être celui de tout système graphique : celui de reproduire avec exactitude la luminosité. Hélas, ce n'est pas le cas.

Lorsque l'image à reproduire est visualisée dans un environnement "clair", où les autres objets de la pièce ont à peu près la même luminosité que le blanc de l'image, alors, un gamma global de 1 est satisfaisant pour reproduire l'image avec une apparence satisfaisante. Des impressions de qualité photographique visualisées sous une bonne lumière ainsi que des écrans d'ordinateurs dans une pièce claire sont des cas typiques "d'environnements clairs".

Parfois, des images sont destinées à être vues en environnement "sombre", dans lesquels seule l'image est lumineuse. On trouve les films ou présentations (sur transparents) par projection dans ce cas de figure. Dans certaines circonstances, une reproduction exacte de l'original produit une sensation subjective de "platitude" et de manque de contraste. Il apparaît que l'image projetée nécessite un gamma d'environ 1,5 par apport à la source originale pour être perçue comme naturelle. Ainsi, les films pour transparents sont conçus pour présenter un gamma de 1,5, et non 1.

Il existe enfin une situation intermédiaire d'environnement "atténué", dans laquelle l'environnement reste toujours perceptible à l'oeil, mais plus sombre que l'image visualisée. Ceci est le cas lorsque l'on regarde la télévision, en début de soirée, ou dans des salles d'ordinateurs insuffisamment éclairées. Dasn ces conditions, le système devra présenter un gamma de 1,25 pour une perception naturelle. La nécessité d'augmenter le contraste (gamma) dans des environnements sombres découle de la façon dont la perception visuelle humaine fonctionne, et s'applique de ce fait aussi aux moniteurs informatiques. Ainsi, un client PNG désireux d'obtenir le plus de réalisme possible pour l'affichage des images doit connaître dans quelles conditions de luminosité ces images sont visualisées, et devra ajuster le gamme des images affichées en conséquence.

Si poser la question à l'utilisateur quant aux conditions d'éclairage dont il dispose se révèle inapproprié ou impossible, le client PNG devra choisir un gamma par défaut (gamma d'affichage comme défini ci-après) de 1 ou 1,25. C'est ce que la plupart des systèmes qui implémentent la correction de gamma font.

Qu'est ce que le gamma d'un écran ?

Presque tous les écrans vidéo informatiques ont une fonction de transfert en puissance affichant un gamma de 2,5. Cette valeur est la conséquence de la technologie permettant le contrôle du faisceau d'électrons dans le canon à électrons, et ne dépend pas des photophores.

Font exception à cette règle les moniteurs "de référence", disposant d'une électronique qui permet d'altérer leur fonction de transfert. Si vous disposez d'un tel moniteur, il est probable que le constructeur vous spécifiera son gamma. Dans tous les autres cas, on pourra estimer avec une certitude suffisante que le gamma vaut 2,5.

Il existe plusieurs mires de calibration qui permettent de mesurer le gamma, en général, en comparant l'intensité d'une zone contenant une séquence de noir et de blanc avec celle d'une zone contenant une suite de niveaux de gris de luminosité croissante. Ces techniques ne sont pas d'une très grande précision. Des images constituées d'un "damier" fin de blanc et de noir sont les moins efficaces, car la reproduction d'un pixel blanc paraîtra beaucoup plus sombre qu'une grande zone de blanc. Une image proposant une séquence de lignes horizontales blanches et noires (comme l'image "gamma.png" à l'adresse ftp://ftp.uu.net/graphics/png/images/suite/gamma.png) donne de bien meilleurs résultats, sauf à des très hautes définitions sur certains écrans.

Si vous disposez d'un bon photomètre, vous pouvez mesurer la lumière émise par une séquence de gris sur le moniteur en mesurant la tension d'entrée et calculer la fonction puissance qui correspond aux points de mesure. Cependant, cette méthode reste très sensible au réglage du "noir" du moniteur, moyennement sensible à la définition, et encore l"gèrement sensible à la lumière ambiante. De plus, le verre de l'écran diffuse de la lumière depuis les zones éclairées vers les zones sombres limitrophes ; un pixel unique blanc sur un fond noir peut ainsi apparaître comma ayant un "halo". Votre technique de mesure devra faire en sorte de limiter ces effets parasites.

Comme il est effectivement assez difficile d'obtenir une mesure précise du gamma réel, que ce soit avec une image test ou par mesure photométrique, il est plus pratique d'accepter de prendre la valeur 2,5 comme estimation "suffisante".

Qu'entend-t-on par correction gamma ?

Un moniteur a un gamma de 2,5, et nous ne pouvons rien y changer. Pour atteindre un gamma global de 1 (ou du moins proche de 1) dans un système graphique, il sera nécessaire qu'au moins un autre composant de la "chaîne graphique" soit non linéaire. Si, dans les faits, un seul étage de la chaîne, autre que le moniteur, est non linéaire, alors il est de coutume de dire que le moniteur a un certain gamma, et que l'autre composant non linéaire effectue la "correction gamma" pour compenser la non linéarité du moniteur. Cependant, l'endroit réel où la "correction" est effectuée dépend des circonstances.

Dans tous les systèmes de télédiffusion et de vidéo, la correction gamma est effectuée par la caméra. Ce choix à été fait à l'époque où l'électronique vidéo était entièrement analogique, et un bon circuit de correction gamma était très coûteux. Le standard vidéo NTSC original imposait aux caméras un gamma de 1/2,2 (à peu près 0,45). Récemment, une fonction de transfert plus complexe à deux zones a été adoptée [SMPTE-170M], mais son comportement peut être assimilé approximativement à une fonction de puissance de gamma 0,5. Lorsque l'image résultante est affichée à l'écran (disposant d'un gamma de 2,5), un gamma d'environ 1,25 par rapport à la scène originale est obtenu, qui correspond à un visionnage en environnement "atténué".

Aujourd'hui, le signal vidéo est de plus en plus souvent numérisé, et affiché dans des tampons graphiques numériques. Ceci fonctionne très bien, mais souvenez-vous que du fait que la correction gamma est "intégrée" au signal vidéo, les images numériques résultantes auront un gamma d'environ 0,5 par rapport à la scène réelle. Les logiciels de rendu d'image de synthèse produisent souvent des échantillons selon une échelle linéaire. Pour les afficher correctement, il est nécessaire que la luminosité de l'écran soit directement proportionnelle aux données enregistrées dans le tampon graphique. Ceci peut être obtenu en intercalant entre le tampon et l'électronique de l'écran une table de conversion. Cette table de conversion (souvent appelée LUT) est chargée avec une fonction de puissance de gamma 0,4, "corrigeant" ainsi la non linéarité du moniteur.

Il arrive que la correction gamma soit tantôt faite avant le tampon graphique, tantôt après. Tant que les images créées dans un environnement particulier sont affichées dans cet environnement, tout va bien. Mais dès que les images sont échangées avec d'autres personnes, les différences de conventions de correction gamma font que les images semblent trop claires ou fades (sous exposées), ou trop sombres et trop contrastées (surexposées).

Alors, faut-il mieux corriger avant ou après le tampon graphique ?

L'idéal serait que les échantillons soient enregistrés en virgule flottante. La précision serait très fine, et cette question deviendrait inutile. Mais dans la réalité, nous essayons toujours d'enregistrer une image avec le minimum de bits possible.

Si nous décidions d'utiliser un modèle d'échantillons linéaires, et effectuer la correction gamma au niveau de la table de conversion LUT du tampon graphique, alors la profondeur nécessaire pour chaque canal primaire rouge, vert et bleu se révèle être de 12 bits pour obtenir une précision suffisante d'intensités. A moins que cela, on pourra voir apparaître des "bandes de contour" dans les parties sombres de l'image, lorsque deux échantillons adjacents ont une valeur d'intensité encore trop différente, mais pas assez pour être visible.

Cependant, par une coïncidence heureuse, la perception visuelle humaine de la luminosité répond à une loi physique ressemblant très fortement à la fonction de puissance utilisée pour la correction gamma. Si nous appliquons la correction gamma sur les échantillons mesurés ( ou calculés par un logiciel d'imagerie) avant leur quantification en entiers, nous aurons besoin de moins de bits pour enregistrer l'image. En réalité, 8 bits par couleur primaire sera en général suffisant pour éviter les artefacts de contour. Ceci est dû au fait que, comme la correction gamma est très proche de la perception visuelle, nous codons dans ce cas une variation linéaire de la perception d'intensité lumineuse sous forme d'une variation non linéaire d'excitation électrique du tube.

Comparé à un codage linéaire, nous associons moins d'étendue aux teintes claires de l'image et plus d'étendue aux teintes sombres.

Ainsi, tout en obtenant une image de qualité visuelle équivalente, des images enregistrées avec une correction gamma préalable utilisent un tiers de moins de place que des images codées en linéaire.

Généralisation de la gestion de gamma

Lorsque plus de deux éléments d'une chaîne graphique ont un comportement non linéaire, le terme "correction gamma" devient trop vague. Si nous considérons un système qui capture (ou calcule) une image, la convertit et l'enregistre dans un fichier, lit et décode le fichier, et enfin affiche l'image sur un écran, on trouve 5 endroits dans la chaîne qui peuvent présenter une fonction de transfert non linéaire. Nous allons donner un nom spécifique pour chacune de leur caractéristique gamma:

camera_gamma
Les caractéristiques du capteur d'acquisition

encoding_gamma
Le gamma de toute transformation effectuée par le logiciel lors de l'enregistrement du fichier

decoding_gamma
Le gamma de toute transformation effectuée par le logiciel lors de la lecture du fichier

LUT_gamma
Le gamma du tampon d'image LUT, s'il existe

CRT_gamma
Le gamma du moniteur, en général 2,5

Nous y ajouterons quelques définitions supplémentaires:

file_gamma
Le gamma résultant de l'image dans le fichier, par rapport à la scène originale. Il vaut

file_gamma = camera_gamma * encoding_gamma

display_gamma
Le gamma du "système d'affichage" complet. Il s'agit de

display_gamma = LUT_gamma * CRT_gamma

viewing_gamma
Le gamma global que nous souhaitons obtenir pour un affichage agréable des images, soit 1,0 ou 1,5.

La valeur file_gamma, telle que définie ci-dessus, est celle qui est notée dans le bloc gAMA d'un fichier PNG. Si file_gamma est différent de 1, nous pourrons détecter qu'une correction gamma a été faite avant d'enregistrer le fichier, et nous dirons que nous travaillons avec des "échantillons corrigés". Cependant, comme la chaîne graphique peut associer plusieurs gamma distincts, certains d'entre eux étant inconnus lorsque le fichier est écrit, la "correction" que nous détectons ne correspond pas forcément à une condition d'affichage identifiée. Comme nous utilisons une fonction de puissance lorsque nous convertissons les échantillons en entiers, qui correspond en tout point à une fonction gamma, il est plus correct de dire que les échantillons du fichier PNG sont "encodés gamma" plutôt que "corrigés". Lors de l'affichage d'une image d'un fichier, le programme qui décode l'image porte la responsabilité de restituer un gamma final égal au viewing_gamma, en choisissant une valeur appropriée pour le decoding_gamma. Lorsque nous décoderons un fichier PNG, la bloc gAMA nous donnera une valeur pour le file_gamma. Le display_gamma doit pouvoir être connu pour la machine concernée, ou peut être retrouvé dans les paramètres ou informations système (en dernier recours, il sera toujours possible de demander à l'utilisateur de rentrer une valeur de gamma). Le viewing_gamma à obtenir dépendra aussi des conditions d'éclairage environnant, information que nous ne pourrons généralement obtenir que de l'utilisateur.

En fin de chaîne, la formule finale donne

file_gamma * decoding_gamma * display_gamma = viewing_gamma

Quelques exemples spécifiques

Dans les systèmes vidéo numériques, le camera_gamma vaut à peu près 0,5 selon ce qui est spécifié dans la majorité des standards déclarés. Le CRT_gamma vaut 2,5 comme toujours, tandis que les encoding_gamma, decoding_gamma, et LUT_gamma valent tous 1. Le viewing_gamma résultant vaut alors 1,25. Sur des moniteurs graphiques de référence utilisant une table de correction au niveau du tampon graphique, et de ce fait calibrés pour effectuer un affichage linéaire, le display_gamma vaut 1. De nombreuses station de travail, les terminaux X et les écrans PC ne disposent pas de tables de correction gamma. Le LUT_gamma est donc toujours de 1, et display_gamma vaut 2,5. Les écrans Macintosh disposent d'une LUT. Par défaut, elle est chargée avec une table donnant une fonction gamma de 0,72, et donc un display_gamma (LUT et moniteur combinés) d'environ 1,8. Certains Macs ont un "tableau de bord Gamma" qui permet de redéfinir le display_gamma à 1,0, 1,2, 1,4, 1,8, ou 2,2. Ces réglages se font en chargeant des tables précalculées. Sur ces machines, la valeur de gamma mentionnée dans le tableau de bord "Gamma" peut être utilisée en lieu et place du display_gamma dans les calculs de la chaîne. Certains systèmes SGI récents (Silicon Graphics) disposent d'une correction gamma matérielle par une table dont le contenu est contrôle par le programme (privileged) "gamma". Le gamma mentionné par ce programme est l'inverse du LUT_gamma. Pour obtenir le display_gamma, vous devrez relever la valeur du SGI_system_gamma (soit en lisant dans le bon fichier, ou en le demandant à l'utilisateur) puis calculer

display_gamma = 2.5 / SGI_system_gamma

Vous trouverez des systèmes SGI de system_gamma 1.0 et 2.2 (ou supérieur), la valeur par défaut en sortie d'usine étant 1,7.


Précédent - Introduction aux couleurs - Retour au sommaire