Convertir la température de couleur (K) en RVB: exemple d'algorithme et de code



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. Source

Il 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 moderne

Voici 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 K

Comme 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). Source

Il 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:

 '   ( )  RGB- Private Sub getRGBfromTemperature(ByRef r As Long, ByRef g As Long, ByRef b As Long, ByVal tmpKelvin As Long) Static tmpCalc As Double '      1000  40000  If tmpKelvin < 1000 Then tmpKelvin = 1000 If tmpKelvin > 40000 Then tmpKelvin = 40000 '   tmpKelvin \ 100,       tmpKelvin = tmpKelvin \ 100 '     '  If tmpKelvin <= 66 Then r = 255 Else ':  R-    0,988 tmpCalc = tmpKelvin - 60 tmpCalc = 329.698727446 * (tmpCalc ^ -0.1332047592) r = tmpCalc If r < 0 Then r = 0 If r > 255 Then r = 255 End If '  If tmpKelvin <= 66 Then ':  R-    0,996 tmpCalc = tmpKelvin tmpCalc = 99.4708025861 * Log(tmpCalc) - 161.1195681661 g = tmpCalc If g < 0 Then g = 0 If g > 255 Then g = 255 Else ':  R-    0,987 tmpCalc = tmpKelvin - 60 tmpCalc = 288.1221695283 * (tmpCalc ^ -0.0755148492) g = tmpCalc If g < 0 Then g = 0 If g > 255 Then g = 255 End If ',  If tmpKelvin >= 66 Then b = 255 ElseIf tmpKelvin <= 19 Then b = 0 Else ':  R-    0,998 tmpCalc = tmpKelvin - 10 tmpCalc = 138.5177312231 * Log(tmpCalc) - 305.0447927307 b = tmpCalc If b < 0 Then b = 0 If b > 255 Then b = 255 End If End Sub 

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 action

L'outil de température de couleur réelle dans mon programme PhotoDemon est le suivant:


Outil de température de couleur PhotoDemon

Té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 .

Source: https://habr.com/ru/post/fr427333/


All Articles