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.
.
.
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 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.
..
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 !
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.
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?
..
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.
appli \ OS | XP | Vista | Win7 |
PSP | bon | ? | ? |
Irfanview | mauvais | mauvais | ? |
FastStone | mauvais | bon | ? |
(Refaire une mire en bmp clean!)
Mire originale:
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
![]() |
[50%, 50%,
50%]=gris 50% [50%, 50%, 50%]=gris 50%
![]() |
[0%, 0%, 50%]=bleu 50% [100%, 100%, 50%]=jaune paille
![]() |
[50%, 0%, 50%]=violet [50%, 100%, 50%]=vert pâle
![]() |
[50%, 50%,
50%]=gris 50%
[50%, 50%, 50%]=gris 50%
![]() |
[0%, 50%, 0%]=vert 50% [100%, 50%, 100%]=violet clair
![]() |
[50%, 50%, 0%]=jaune caca [50%, 50%, 100%]=violet clair
![]() |
[50%, 50%,
50%]=gris 50%
[50%, 50%, 50%]=gris 50%
![]() |
[50%, 0%, 0%]=rouge 50% [50%, 100%, 100%]=bleu ciel
![]() |
Jpg obtenus par Irfanview XP ou Vista:
XP=mauvais Vista=mauvais
jpg obtenu par FastStone 4.2 sous XP:
Mauvais!
jpg obtenu par FastStone 4.2 sous Vista32:
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!
à refaire à partir d'un bmp!
appli \ OS | XP | Vista | Win7 |
PSP | bon | ? | ? |
Irfanview | mauvais | mauvais | ? |
FastStone | mauvais | bon | ? |
Mire originale:
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
![]() |
[75%, 75%,
25%]=jaune [25%, 25%, 75%]=bleu clair
![]() |
[0%, 0%, 50%]=bleu 50% [100%, 100%, 50%]=jaune paille
![]() |
[50%, 0%, 50%]=violet [50%, 100%, 50%]=vert pâle
![]() |
[50%, 50%,
50%]=gris 50%
[50%, 50%, 50%]=gris 50%
![]() |
[0%, 50%, 0%]=vert 50% [100%, 50%, 100%]=violet clair
![]() |
[50%, 50%, 0%]=jaune caca [50%, 50%, 100%]=violet clair
![]() |
[25%, 75%, 75%]
[75%, 25%, 25%]
![]() |
[50%, 0%, 0%]=rouge 50% [50%, 100%, 100%]=bleu ciel
![]() |
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
Irfanview 4.27, jpg sous XP fam
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!
.
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, 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!
.
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)
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)
ref GammaFAQ.pdf par Ch Poyton
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.
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.
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)
.
% | 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 |
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