
Si vous ne savez pas quelle est la température de couleur,
commencez ici .
Tout en travaillant sur l'outil Température de couleur pour
PhotoDemon , j'ai passé toute la soirée à essayer de déterminer un algorithme simple et clair pour la conversion entre les valeurs de température (en Kelvin) et RVB. Je pensais qu'un tel algorithme serait facile à trouver, car de nombreux éditeurs photo ont des outils pour corriger la température des couleurs, et dans chaque appareil photo moderne, y compris les smartphones, il y a un ajustement de la balance des blancs en fonction des conditions d'éclairage.
Un exemple d'Ă©cran de camĂ©ra avec un rĂ©glage de balance des blancs. SourceIl s'est avĂ©rĂ© qu'il est presque impossible de trouver une formule fiable pour convertir la tempĂ©rature en RVB. Bien sĂ»r, il existe des algorithmes, mais la plupart fonctionnent en convertissant la tempĂ©rature dans l'espace colorimĂ©trique XYZ, auquel vous pouvez ensuite ajouter la transformation RVB. De tels algorithmes semblent ĂȘtre basĂ©s sur la mĂ©thode Robertson, dont une implĂ©mentation est
ici , et l'autre est
ici .
Malheureusement, cette approche ne fournit pas une formule purement mathĂ©matique - c'est simplement une interpolation selon la table de conversion. Cela peut ĂȘtre raisonnable dans certaines circonstances, mais si vous prenez en compte la conversion supplĂ©mentaire XYZ â RVB, elle s'avĂšre trop lente pour un simple rĂ©glage de la tempĂ©rature de couleur en temps rĂ©el.
J'ai donc écrit mon propre algorithme, et cela fonctionne trÚs bien. Voilà comment je l'ai obtenu.
Avertissements concernant cet algorithme
Avertissement 1 : mon algorithme fournit une approximation de haute qualité, mais il n'est pas suffisamment précis pour une utilisation scientifique sérieuse. Il est principalement destiné à la manipulation de photographies - n'essayez donc pas de l'utiliser pour l'astronomie ou la médecine.
Avertissement 2 : en raison de sa relative simplicité, cet algorithme est suffisamment rapide pour fonctionner en temps réel sur des images de taille raisonnable (je l'ai testé sur des images de 12 mégapixels), mais pour de meilleurs résultats, utilisez des optimisations mathématiques spécifiques à votre langage de programmation. Je montre l'algorithme sans optimisations mathématiques afin de ne pas le compliquer.
Avertissement 3 : l'algorithme est uniquement destinĂ© Ă ĂȘtre utilisĂ© dans une plage de 1000 K Ă 40 000 K, ce qui est une bonne plage pour la photographie. (En fait, il est beaucoup plus grand que ce qui peut ĂȘtre requis dans la plupart des situations). Bien que cela fonctionne pour des tempĂ©ratures en dehors de cette plage, la qualitĂ© diminuera.
Remerciements particuliers Ă Mitchell Charity
Tout d'abord, je dois payer beaucoup de dettes et remercier Mitchell Charity pour les données initiales que j'ai utilisées pour créer ces algorithmes: un
fichier de corps noir non traité . Charity fournit deux ensembles de données et mon algorithme utilise la
fonction de correspondance des couleurs Ă 10 degrĂ©s CIE 1964 . Une discussion de la fonction CIE 1931 Ă 2 degrĂ©s avec les corrections de Judd Wos par rapport Ă l'ensemble Ă 10 degrĂ©s dĂ©passe le cadre de cet article, mais si vous ĂȘtes intĂ©ressĂ©, vous pouvez commencer une analyse complĂšte Ă partir de
cette page .
Algorithme: exemple de sortie
Voici la sortie de l'algorithme dans la plage de 1000 K Ă 40 000 K:
La sortie de mon algorithme est de 1000 K Ă 40 000 K. Le point blanc est Ă 6500â6600 K, ce qui est idĂ©al pour traiter des photos sur un moniteur LCD moderneVoici un instantanĂ© plus dĂ©taillĂ© de l'algorithme dans une plage intĂ©ressante pour la photographie de 1500 K Ă 15000 K:
Le mĂȘme algorithme, mais de 1500 K Ă 15000 KComme vous pouvez le voir, les bandes sont minimes, ce qui est une grande amĂ©lioration par rapport aux tableaux de correspondance ci-dessus. L'algorithme fait Ă©galement un excellent travail pour prĂ©server une teinte jaune clair prĂšs du point blanc, ce qui est important pour simuler la lumiĂšre du jour dans les photos de post-traitement.
Comment je suis arrivé à cet algorithme
La premiÚre étape pour dériver une formule fiable a été de tracer les
valeurs originales du corps noir de Charity . Vous pouvez télécharger l'
intégralité de la feuille de calcul au format LibreOffice / OpenOffice .ods (430 Ko) .
Voici les données aprÚs traçage:
Données de température d'origine (K) en RVB (sRGB), graphique LibreOffice Calc. Encore une fois, la conversion est basée sur la fonction CMF à 10 degrés CIE 1964. Le point blanc, comme requis, se situe entre 6500 K et 6600 K (pic sur le cÎté gauche du graphique). SourceIl est facile de remarquer qu'il existe plusieurs sections qui simplifient notre algorithme. En particulier:
- Les valeurs rouges inférieures à 6600 K sont toujours 255
- Les valeurs bleues inférieures à 2000 K sont toujours 0
- Les valeurs bleues au-dessus de 6500 K sont toujours 255
Il est également important de noter que pour adapter la courbe aux données, le vert est mieux considéré comme deux courbes distinctes - l'une pour les températures inférieures à 6600 K, et l'autre pour les températures supérieures à ce point.
Ă partir de ce moment, j'ai divisĂ© les donnĂ©es (sans les segments «toujours 0» et «toujours 255») en composants de couleur distincts. Dans un monde idĂ©al, la courbe peut ĂȘtre ajustĂ©e Ă chaque ensemble de points, mais malheureusement, en rĂ©alitĂ©, ce n'est pas si simple. Puisqu'il y a une forte diffĂ©rence entre les valeurs de X et Y sur le graphique - toutes les valeurs x sont supĂ©rieures Ă 1000 et sont affichĂ©es dans 100 segments de points, tandis que les valeurs y sont comprises entre 255 et 0 - j'ai dĂ» transposer les donnĂ©es x pour obtenir le meilleur ajustement. Ă des fins d'optimisation, j'ai d'abord divisĂ© la valeur x (tempĂ©rature) par 100 pour chaque couleur, puis soustrait le montant dont j'avais besoin si cela aidait beaucoup Ă s'adapter au graphique. Voici les diagrammes rĂ©sultants pour chaque courbe, ainsi que la courbe la plus appropriĂ©e et la valeur correspondante du coefficient de dĂ©termination (R au carrĂ©):




Je m'excuse du terrible crénage des polices et des allusions sur les graphiques. LibreOffice présente de nombreux avantages, mais l'incapacité de lisser les polices sur les graphiques est totalement honteuse. Je n'aime pas non plus extraire des diagrammes de captures d'écran, car ils n'ont pas d'option d'exportation, mais il est préférable de le laisser pour plus tard.
Comme vous pouvez le voir, toutes les courbes sont assez bien alignées, avec des valeurs du coefficient de détermination supérieures à 0,987. Je pourrais passer plus de temps à ajuster les courbes, mais cela suffit pour le traitement des photos. Pas un seul habitant ne dira que les courbes ne correspondent pas exactement aux observations idéalisées initiales du corps noir, non?
Algorithme
Voici l'algorithme dans toute sa splendeur.
Tout d'abord, le pseudo-code:
- 1000 40000. ( , 40000 K). , . Set Temperature = Temperature \ 100 : If Temperature <= 66 Then Red = 255 Else Red = Temperature - 60 Red = 329.698727446 * (Red ^ -0.1332047592) If Red < 0 Then Red = 0 If Red > 255 Then Red = 255 End If : If Temperature <= 66 Then Green = Temperature Green = 99.4708025861 * Ln(Green) - 161.1195681661 If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 Else Green = Temperature - 60 Green = 288.1221695283 * (Green ^ -0.0755148492) If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 End If : If Temperature >= 66 Then Blue = 255 Else If Temperature <= 19 Then Blue = 0 Else Blue = Temperature - 10 Blue = 138.5177312231 * Ln(Blue) - 305.0447927307 If Blue < 0 Then Blue = 0 If Blue > 255 Then Blue = 255 End If End If
Notez que dans le pseudo-code ci-dessus,
Ln () signifie le logarithme naturel . Notez également que vous pouvez omettre la vérification si la couleur est inférieure à 0, si la température est toujours dans la plage recommandée. (Cependant, vous devez toujours laisser la coche "si la couleur est supérieure à 255").
Concernant le code réel, voici la fonction Visual Basic exacte que j'utilise dans
PhotoDemon . Il n'a pas encore été optimisé (par exemple, les logarithmes seront beaucoup plus rapides avec les tables de correspondance), mais au moins le code est concis et lisible:
La fonction a été utilisée pour générer l'exemple de sortie au début de cet article, donc je peux garantir que cela fonctionne.
Exemples d'images
Voici un excellent exemple de ce que les ajustements de tempĂ©rature de couleur peuvent faire. L'image ci-dessous, une affiche publicitaire pour True Blood de HBO, montre de maniĂšre spectaculaire le potentiel d'ajustement de la tempĂ©rature de couleur. Ă gauche, le cadre d'origine; Ă droite - ajustez la tempĂ©rature de couleur en utilisant le code ci-dessus. En un clic, la scĂšne nocturne peut ĂȘtre refaite pour la lumiĂšre du jour.
Réglage de la température de couleur en actionL'outil de température de couleur réelle dans mon programme PhotoDemon est le suivant:
Outil de température de couleur PhotoDemonTéléchargez le programme et regardez-le en action.
Mise Ă jour d'octobre 2014
Renault Bedar a fait une excellente
démonstration en ligne de cet algorithme. Merci Renault!
Mise Ă jour avril 2015
Merci Ă tous ceux qui ont suggĂ©rĂ© des amĂ©liorations Ă l'algorithme d'origine. Je sais que l'article contient de nombreux commentaires, mais ils mĂ©ritent d'ĂȘtre lus si vous prĂ©voyez de mettre en Ćuvre votre propre version.
Je veux souligner deux améliorations spécifiques. Tout d'abord, Neil B a aimablement fourni la meilleure version pour les fonctions d'ajustement de courbe d'origine, ce qui modifie légÚrement les coefficients de température. Les changements sont décrits en détail dans
son excellent article .
Francis Loch a ensuite ajouté quelques commentaires et exemples d'images, qui sont trÚs utiles si vous souhaitez appliquer ces transformations aux photos. Ses modifications produisent une image beaucoup plus détaillée,
comme le montrent les exemples .