Retour au sommaire de la section

 Essais et rédaction en cours, donc résultats préliminaires!
En gros, en traitant d'un problème de gamma, j'ai découvert un bug du jpeg

Le système jpg +PC utilise une loi en 1/gamma, pour compenser les lois en gamma que l'on trouve dans les dispositifs d'affichage (écrans).

(Pour être plus précis, c'est l'OS qui doit naviguer dans un espace en 1/gamma. L'algorithme jpg "ne fait que" du Yuv,  de la DCT, approximation, + Huffman)

Note: Je voudrais aussi préciser que des approximations ont été faites dans ce document, on ne peut pas tout expliquer, cela compliquerait un peu trop le texte.
.
.

Rappel historique: pourquoi le gamma?


Les premiers dispositifs d'affichage utilisaient des tubes à rayons cathodiques (CRT). La loi de luminosité suit une courbe en gamma (un peu plus qu'une parabole)  L=f(v) ^gamma.  Gamma=2.2.   Souvenez-vous de Child-Langmuir et autres confrères... [puissance 3/2 qu'il faut mettre au carré! puisque la lumière dépend de i²! 1.5²=2.25]

Les chaînes de transmission télévision n'offraient pas une grande dynamique... de l'ordre de 40 dB (en circuit fermé). Souvent limitée à 30 dB (en transmission hertzienne). Cela conduit à une dynamique de l'ordre de 100 (ou nettement moins, en réalité TV), ce qui est faible pour des images!

L'étude de la vision conduit également, à constater que l'oeil est incapable de voir/juger des différences de luminosité plus faibles que 4%. Il ne sert donc à rien d'avoir une précision de codage meilleure que ces 4%. On retrouve là, la constatation des lois logarithmiques qui régissent les organes sensoriels humains.  [des mesures plus récentes indiquent plutôt 1% -> 14 bits el linéaire ou 9 bits en log, arrondi à 8 bits avec la rec709]

Il était ainsi assez évident, qu'il fallait utiliser une sorte de compression... une loi en 1/gamma permettait de compenser les effets de l'afficheur. Le bruit devenait ainsi moins visible. La dynamique des images était grandement améliorée. Ne pas oublier qu'on arrive assez facilement à faire des lois exponentielles avec des amplis Op (même à tubes! vous savez, en mettant une diode en contre-réaction...). Ces dispositifs de correction en 1/gamma étaient inclus dans les caméras de télévision. (assez chers, mais limités aux caméras, ou à leurs boitiers de contrôle)  En 1965 les caméras N&B ou couleur avaient ces dispositifs. (faut-il vraiment mettre ici un schéma de l'époque?)

..

Dans le monde du PC


Dans la mémoire ou dans les fichiers, on aura des données ayant ce codage en 1/gamma. Mais ces données ne représentent pas directement des luminances! et beaucoup l'oublie! (ex Microsoft) Ainsi, si on désire faire la moyenne entre 2 pixels, il ne faut pas prendre les valeurs en mémoire de ces 2 pixels, et en faire la moyenne, mais on doit d'abord tenir compte du gamma, faire la moyenne et recoder en tenant compte du 1/gamma.

Je vais montrer, dans la suite de ce document, que beaucoup de softs ne suivent pas la bonne règle, et que cela dépend des OS! (Les plus récents ont fini par corriger le problème!)

Cette réflexion est intervenue lorsque j'ai décidé de régler le gamma de mes écrans, sans faire appel à un spectromètre.

.
.

Régler ses écrans



Le principe:

Un gris moyen est égal au mélange, à parts égales, de blanc et de noir. Il donne ainsi un gris à 50%. (blanc=100% Noir=0%)

On peut ainsi générer une mire comportant 2 zones:

- une zone avec un gris moyen

- une zone faite avec des lignes horizontales alternée blanche/noire/blanche...

L'expérience, et le calcul, montre qu'il faut donner au gris moyen la valeur de 186 (par rapport à 255, c'est à dire codage 8 bits) Ainsi 186+186=255 ! ou 255/2=186 !


MIRE50.bmp
MIRE50.bmp
Mire "MIRE50.bmp" pour contrôler le gamma dans la zone Luminance=50%
Déplacer cette mire avec l'ascenseur vertical, et contrôler que cela reste valable en haut, au centre et en bas.
Si oui vous avez un bon écran, si non ... il sera difficile de régler le gamma!

Note: On ne peut pas utiliser des lignes verticales alternées, car un problème de temps de montée/descente des signaux électroniques (donc de bande passante) apportent des perturbations importantes.


MIRE50V.png
MIRE50V.png
Mire avec lignes verticales: permet de juger de la bande passante... non fiable pour évaluer le gamma!
Une teinte non grise indique un déséquilibre entre les amplis RVB.
Vous pouvez également juger de l'angle de vision de votre écran en déplaçant la tête de doite à gauche...

.

Contrôler son jpg


Cela va dépendre, comme nous allons le voir, de l'OS et du logiciel utilisés!

Enregistrez la mire MIRE50.bmp ci-dessus, en standard BMP.

Lancez votre logiciel de traitement d'image ou votre viewer.

Chargez cette image bmp, et enregistrez la en jpg.

Puis rechargez le jpg... que voyez-vous maintenant? Un image comme l'originale ou une autre avec des différences?

..

Mire 50%


On prend l'image Clipboard02.bmp, et on l'enregistre en jpg. puis on regarde à nouveau la jpeg... ce n'est plus le même contenu!
(Ils ont oublié, dans l'algorithme jpg, de passer en espace 16 bits, en appliquant la loi en gamma inverse =1/2.2)
PSP12, traite cela correctement.

MireCr50.png
mire 50% originale, png


MireCr50_Irf_XP.jpg
jpg fait par IrfanView sous XP fam: mauvais

Le gris central est bon, les couleurs centrales sont bonnes.
Mais les zones externes (barres horizontales noires et couleurs fondamentales) sont complètement modifiées.
(bords droit et gauche)
Elles ne font plus noir=0 et couleur=186, mais: 
Motif rouge: Lignes noires [0,0,0] -> [90,0,0] et lignes rouges [186,0,0] ->[165,37,36]
Motif vert:  Lignes noires [0,0,0] -> [0,53,0] et lignes vertes [0,186,0] ->[74,203,76]
Motif rouge: Lignes bleues [0,0,0] -> [0,0,113] et lignes bleues [0,0,186] ->[14,15,141]





MireCr50_irf_VS.jpg
[MireCr50_irf_VS.jpg image crée par Vincent]
 Jpg fait par IrfanView sous Vista32:
(mauvais sur les cotés)



MireCr50_FS_XP.jpg
jpg fait par FastStone sous XP fam: mauvais sur les cotés
Valeurs semblables à IrfanView




MireCr50_fs_VS.jpg
[MireCr50_fs_VS.jpg image crée par Vincent]
jpg fait par FastStone sous Vista32
(correct)






[image à créer=identique à l'originale. Me croire sur paroles!]
Jpg fait par PSP12 sous XP: correct



.

Le point de vue histogramme




Vincent m'a soumis l'idée, qu'on pouvait mesurer le résultats en utilisant l'histogramme de l'image.


Pour la mire50
(du début de la page)

Histo_Mire50.png   Histo_MIRE50_Irf.png   Histo_MIRE50jpg_Irf.png
       Histo_Mire50.png                    Histo_MIRE50_Irf.png                Histo_MIRE50jpg_Irf.png
Original                                    Irfanview                                   Irfanview
On voit (assez mal!) que sur l'original, on a bien 3 raies principales (la petite 4ème correspond à l'encadrement bleu)
En zoomant cet histogramme, la raie correspondant au blanc, sur l'histogramme de gauche, est transformée en 3 raies de 0.5% 5.8% et 17.2% et quelques autres de 0.1%  (au lieu de 24.2%)


La mire couleur originale MireCr50.bmp

Elle est composée de gris moyen 50% (donc R moyen 50%, V moyen 50%, B moyen 50%) ou de barres alternées noires ou lumineuses à 100%.
On doit donc obtenir 3 raies par histogramme: Noire=66.6%    moyen=16.6%    blanche(lumineux)=16.6%

MireCr50.bmp_R.png   MireCr50.bmp_V.png  MireCr50.bmp_B.png
soit un total de 9 couleurs.



La mire couleur Irfanview sous XP
  MireCr50_Irf_XP.jpg

Histo_MireCr50_Irf_XP_R.png   Histo_MireCr50_Irf_XP_V.png   Histo_MireCr50_Irf_XP_B.png
soit un total de 1639 couleurs.

On voit bien, ici, que Irfanview ne fait pas bien le travail. On voit apparaitre des raies anormales dans les foncés.

FastStone sous XP, donne à peu près les mêmes résultats... (mêmes raies RVB)  mais avec 2047 couleurs.



La mire couleur Irfanview sous Vista  MireCr50_irf_VS.jpg

Histo_MireCr50_irf_VS_R.png   Histo_MireCr50_irf_VS_V.png   Histo_MireCr50_irf_VS_B.png
soit un total de 452 couleurs.
Les résultats sont encore mauvais. La différence peut être due au taux de compression choisi... ou à Vista


La mire couleur FastStone sous XP  MireCr50_fs_VS.jpg

Mêmes spectres RVB que Irfanview sous XP, mais avec 2047 couleurs.



La mire couleur FastStone sous Vista
  MireCr50_fs_VS.jpg

Mêmes spectres RVB que l'original.
(très légèrement étalé en gaussienne) 3 raies: Rouge=  105838, 18, 0, 0, ... 0,0,0,2, 26035, 20, 0,0, ..., 0, 6, 25590


.



Résultats obtenus
pour la mire Gris50%, RVB


appli \ OS XP Vista Win7
PSP bon ? ?
Irfanview mauvais mauvais ?
FastStone mauvais bon ?

Tests faits avec Irfanview 4.25 Fr sur XP, 4.21 sur Vista, FastStone 4.2 sur les 2 OS.



Mire matricielle plus complexe à 50%


(Refaire une mire en bmp clean!)


Mire originale:

gamma_3x3%20org.jpg

Il y a des défauts sur cette mire d'essais: ce n'est pas une bmp,

et il faudrait des multiples de 8x8 pour que les jpg ne soient pas affectés par des effets de bord.


Principe: On peut faire du gris 50% avec [186,186,186] ou avec des lignes noires [0,0,0] et des lignes blanches [255,255,255]. L'oeil fait la moyenne, si on accepte de faire un léger flou ou de s'éloigner de la mire afin de ne plus distinguer les lignes.

On peut aussi jouer avec des lignes non blanches (gris clair à 75%) genre [0,75,50] et des lignes non noires (gris foncé à 25%) genre [100,25,50]. La moyenne donnera toujours 50%.

On peut aussi jouer avec des lignes non grises en utilisant des couleurs complémentaires. genre [50%,100%,100%] et [50%, 0% 0%]. La moyenne donnera toujours 50% en R, 50% en v et 50% en B (donc 50% en gris)

Exemple dans la mire utilisée ici on va avoir:

[100%, 50%, 50%]=rose
[0%, 50%, 50%]=turquoise

1.bmp
[50%, 50%, 50%]=gris 50%
[50%, 50%, 50%]=gris 50%

4.bmp
[0%, 0%, 50%]=bleu 50%
[100%, 100%, 50%]=jaune paille

7.bmp
[50%, 0%, 50%]=violet
[50%, 100%, 50%]=vert pâle

2.bmp
[50%, 50%, 50%]=gris 50%
[50%, 50%, 50%]=gris 50%

4.bmp
[0%, 50%, 0%]=vert 50%
[100%, 50%, 100%]=violet clair

8.bmp
[50%, 50%, 0%]=jaune caca
[50%, 50%, 100%]=violet clair

3.bmp
[50%, 50%, 50%]=gris 50%
[50%, 50%, 50%]=gris 50%

4.bmp
[50%, 0%, 0%]=rouge 50%
[50%, 100%, 100%]=bleu ciel

9.bmp

Description de la mire 3x3




Jpg obtenus par Irfanview XP ou Vista:

gamma_3x3%20XP%20Irf%20.jpg   gamma_3x3_irf_VSO.jpg

XP=mauvais                                          Vista=mauvais


jpg obtenu par FastStone 4.2 sous XP:

gamma_3x3%20XP%20FS.jpg

Mauvais!

jpg obtenu par FastStone 4.2 sous Vista32:

gamma_3x3_FS_VSO.jpg

Bon! (aux effets de bord près)

N'oubliez pas que cette mire permet de connaître si vos gammas sont bien réglés! et si vous avez de mauvais écrans!

Manips avec les logiciels


à refaire à partir d'un bmp!



Résultats obtenus pour la mire Gris50% multicolore, RVB


appli \ OS XP Vista Win7
PSP bon ? ?
Irfanview mauvais mauvais ?
FastStone mauvais bon ?




Nouvelle mire matricielle plus complexe à 50%

 et 2 cases 75%:25%

Mire originale:


org_bmp/mireB.png

org_bmp/mireB.png

Cette mire est une bmp faite théoriquement (gamma=1/2.2)

Les effets de bord sont dûs à des effets optiques de la vision.


Principe: On peut faire du gris 50% avec [186,186,186] ou avec des lignes noires [0,0,0] et des lignes blanches [255,255,255]. L'oeil fait la moyenne, si on accepte de faire un léger flou ou de s'éloigner de la mire afin de ne plus distinguer les lignes.

On peut aussi jouer avec des lignes non blanches (gris clair à 75%) genre [0,75,50] et des lignes non noires (gris foncé à 25%) genre [100,25,50]. La moyenne donnera toujours 50%.

On peut aussi jouer avec des lignes non grises en utilisant des couleurs complémentaires. genre [50%,100%,100%] et [50%, 0% 0%]. La moyenne donnera toujours 50% en R, 50% en v et 50% en B (donc 50% en gris)

Exemple dans la mire utilisée ici, on va avoir:

[100%, 50%, 50%]=rose
[0%, 50%, 50%]=turquoise

1.bmp
[75%, 75%, 25%]=jaune
[25%, 25%, 75%]=bleu clair

4.bmp
[0%, 0%, 50%]=bleu 50%
[100%, 100%, 50%]=jaune paille

7.bmp
[50%, 0%, 50%]=violet
[50%, 100%, 50%]=vert pâle

2.bmp
[50%, 50%, 50%]=gris 50%
[50%, 50%, 50%]=gris 50%

4.bmp
[0%, 50%, 0%]=vert 50%
[100%, 50%, 100%]=violet clair

8.bmp
[50%, 50%, 0%]=jaune caca
[50%, 50%, 100%]=violet clair

3.bmp
[25%, 75%, 75%]
[75%, 25%, 25%]

4.bmp
[50%, 0%, 0%]=rouge 50%
[50%, 100%, 100%]=bleu ciel

9.bmp

Description de la mire 3x3  JMP

On peut jouer à faire des motifs 25%+75%, 12.5%+87.5% etc... il n'y a plus de limite!

Niveaux utilisés: 100%=255   75%=224   50%=186   25%=136   12.5%=99   6.25%=72 Tout cela est dans le domaine en 1/gamma.

Irfanview 4.27 jpg avec problèmes de subsampling 422 sous XP fam


org_bmp/mireIrf425XP.jpg

Irfanview 4.27, jpg sous XP fam




CONCLUSIONS


Il y a des problèmes avec XP pour Irfanview et FastStone <- NON c'est un problème de sub-sampling 422

Il y a des problèmes avec Irfanview quelque soit l'OS       <- NON c'est un problème de sub-sampling 422

Il serait bon de connaître les résultats avec Win7

Il y a un bug dans le sub-sampling de l'algorithme du jpg!

On peut faire un étalonnage de sa courbe gamma, avec des mires crées pour cet effet. (voir PSP par exemple) Mais il vaut mieux avoir une bonne vision.

Mes écrans sont trop irréguliers... inutile de m'acheter une sonde! Reste à prévoir l'achat de 2 écrans 24" sérieux!


.

Mire Grise pour juger vos courbes gamma 2.2


Niveaux:


N° bande gris gauche milieu droite gauche millieu droite
 supérieure 100% 100% 100% 100% 255+255 255 255+255
2 75% 100%+50% 75% 87.5%+62.5% 255+186 224 240+206
3 50% 100+0 50% 75+25 255+0 186 224-136
4 37.5% 75+0 37.5% 50+25 224+0 163 186+136
5 25% 50+0 25% 37.5+12.5 186+0 136 163+99
6 18.75% 37.5+0 18.75% 25+12.5 163+0 119 136+99
7 12.5% 25+0 12.5% 6.25+18.75 136+0 99 119+72
basse 9.375% 18.75+0 9.375% 12.5+6.25 119+0 87 99+72
à faire 6.25% 12.5+0 6.25%  =?? 99+0  =??  =??


MireGrise.png

MireGrise.png, gamma=2.2





100%






75%






50%






37.5%






25%






18.75%






12.5%







9.375%





6.25%
à faire

Constatations à faire: Le gris reste-il bien gris dans toutes les cases? Si oui vos courbes gamma RVB sont bien ajustées. Dans le cas contraire, il faut les ajuster avec une calibration.

Nota: cette mire DOIT être vue en taille réelle!

Mes conclusions avec mon matériel: Je n'arrive pas à avoir la même luminosité sur la colonne de gauche... Par exemple pour la rangée correspondant au gris 50% (3ème à partir du haut): Pour avoir un équilibre, il faudrait rendre plus lumineux le centre (passer de 186 à 191) Pourquoi? En utilisant le codage sRVB on aurait 187 au lieu de 186, mais cela reste insuffisant.

Réglages complémentaires avec NVidia

Ma carte nVidia, propose un ajustement pour le gamma... !? Je ne sais pas trop à quoi cela correspond... mais en réglant cela (+53%) pour ne plus voir la différence sur la bande 50%, puis en refaisant un calibrage avec la méthode de PSP12, j'arrive à avoir un très bon rendu de cette échelle de gris. (en maintenant la bande jugée au centre de l'écran, puisque avec un écran TN, seul la partie centrale doit être réglée. Il y a trop de disparité entre le haut et le bas.)

Reste à faire:

La mire grise a été générée pour du gamma=2.2. Il faudrait la refaire en sRVB... c'est très long à faire pour moins de 1 % d'erreur!


.

NOTES



Note sur NTSC:

Gamma=2.2

Vout = 4.5 * Vin if Vin < 0.018
Vout = 1.099 * (Vin^0.45) - 0.099 if Vin >= 0.018

Ce qui veut dire: pour éliminer les problèmes près du zéro, la courbe est modifiée par un segment de droite (2% de la courbe)


Note sur Rec.709 transfert function:

Gamma=2.2?

Vout = 4.5 * Vin                             if Vin < 0.018
Vout = 1.099 * (Vin^0.45) - 0.099    if Vin >= 0.018

Ce qui veut dire: pour éliminer les problèmes près du zéro, la courbe est modifiée par un segment de droite (2% de la courbe)

Rec709.png

ref GammaFAQ.pdf par Ch Poyton



Note sur les stations de calcul d'images artificielles (3D):

Gamma=1

On voit bien ici la différence entre les systèmes:

1ere ligne: vidéo [caméra-Ram/Transmission-afficheur] ou photos avec [APN-PC-Afficheur]

2ème ligne: Epace de calcul qui réclame une companding action avant utilisation sur afficheur

4ème ligne montrant le domaine Mac-Intosh avec son gamma=1.8 ce qui impose une correction de gamma par LUT.


Artificielles.png

ref GammaFAQ.pdf par Ch Poyton

Note sur les impressions:

Pour les imprimantes, le gamma est ajusté à 1.75 (comme Apple), car c'est ce qui donne le meilleur résultat sur offset.



Note sur le sRGB:

sRVB_environnement.png

Environnement sRGB

Soit un environnement pas très lumineux 200 lux! et un éclairage à 5000 °K.
.

ref http://www.w3.org/Graphics/Color/sRGB

[=SI(In<=0,00304;  12,92*In;  1,055*( In^(1/2,4) )-0,055) ], donc un gamma 1/2.4 mais décallé pour correspondre à gamma=1/2.2   (voir courbes plus haut)


.

Récapitulatif des différents codages:

.

Gamma2.2 simple:    In^(1/2.2)

On voit qu'en rec709, on a une dynamique de 1000, soit 10 bits  [=SI(In<0,018;  4,5*In;  1,099*(In^(1/2.2))-0,099)]

sRGB: http://www.w3.org/Graphics/Color/sRGB                         [=SI(In<=0,00304;  12,92*In;  1,055*(In^(1/2,4))-0,055) ]


% calcul
gamma=2.2
byte
2.2
calcul
Rec709
calcul
sRGB
100 255 255 255 255
75 223.7 224 220.6 224.6
50 186.1 186 179.3 187.5
37.5 163.3 163 154.2 164.7
25 135.8 136 124 137
12.5 99.1 99 83.7 99.1
6.25 72.3 72 54.2 70.7
3.125 52.8 53 32.7 49.5
2 43.1 43 22.1 38.7
1.8 41.1 41 19.9 36.4
1 11.5 12 11.5 25.5
0.5 5.7 6 5.7 15.6
0.1% 1.1 1 1.1 3.3

Graph%2022%20rec709%20sRVB.png
Remarquez la grande similarité entre le gamma=1/2.2 et le sRVB qui utilise un gamma=1/2.4 avec offset.


.

Remerciements


Merci à Vincent Sonnier pour avoir testé sur Vista32.

Merci à Jean-Claude Sonnier pour avoir remis en cause mes certitudes/approximations concernant la calibration, le gamma, la couleur...

Merci à tous les autres qui ont toujours soutenu la faiblesse du jpg, sans rien y connaître, et qui ont énnoncé doctement des inepties... que beaucoup d'autres ont gobées sans faire attention!

Merci à Eric Brasseur, qui m'a fait découvrir une anomalie dans le sampling d'images. (ref à relire, puisque nouvelle édition) http://www.4p8.com/eric.brasseur/gamma.html