Conversion de la température de couleur (Kelvin) en RVB: algorithme et échantillon

Color Temperature Rgb Conversion



Pour autant que je sache, il est peu probable de trouver une formule fiable pour la conversion de la température de couleur en RVB. Bien qu'il existe de nombreux algorithmes qui réalisent des fonctions similaires, la plupart d'entre eux sont convertis de la température de couleur à l'espace colorimétrique XYZ. Après cela, vous pouvez convertir de l'espace XYZ en espace colorimétrique RVB selon vos besoins. Une implémentation de cet algorithme peut être trouvée ici.

Malheureusement, cette méthode n'est pas une formule mathématique dans le vrai sens du terme, mais juste une implémentation de table de recherche embellie. Dans certains cas, c'est un moyen fiable d'y parvenir. Cependant, en ce qui concerne la conversion XYZ-> RVB, cette méthode est trop lente pour un simple ajustement de la température de couleur en temps réel.



Par conséquent, j'ai implémenté un ensemble d'algorithme de conversion de température de couleur en RVB. Cette conversion d'algorithme est assez bonne. Voici quelques-unes de mes idées.



Certaines limites de l'utilisation de cet algorithme:

  1. Mon algorithme est une estimation de haute précision. Cependant, la précision n'est toujours pas suffisante pour la recherche scientifique. Cet algorithme est principalement utilisé dans certains traitements de photos, n'essayez donc pas d'utiliser cet algorithme dans le domaine de l'astronomie et du traitement d'images médicales.
  2. Étant donné que l'algorithme est relativement simple, cet algorithme est suffisamment rapide lors du traitement d'images de taille appropriée. Cependant, afin d'obtenir de meilleures performances en temps réel, vous devez implémenter l'algorithme pour optimiser le langage de programmation que vous utilisez.
  3. Cet algorithme ne convient que pour la conversion de la température de couleur de 1000K à 40000K. Pour la photographie, une gamme spectrale aussi large est suffisante. Lorsque la température de couleur dépasse cette plage, la précision est réduite.

Implémentation de l'algorithme: exemple de sortie

La figure suivante est une image de l'algorithme produisant 1000K à 40000K.



L'image suivante est la plage de températures de couleur d'intérêt pour la photographie: de 1500K à 15000K



Idées d'implémentation d'algorithmes

Mon premier travail est de Les valeurs d'origine du corps noir de l'organisme de bienfaisance Rétro-ingénierie pour obtenir une formule fiable.

Les valeurs d'origine du corps noir de l'organisme de bienfaisance Les données sous forme de graphique sont exprimées comme suit:

Comme le montre le graphique, il existe des limites supérieures et inférieures, ce qui facilite la mise en œuvre de notre algorithme. spécial:

  1. Lorsque le composant rouge est inférieur à 6600K, il garde toujours 255
  2. La composante bleue reste toujours 0 à 2000K
  3. Bleu demande de garder 255 au-dessus de 6500K

Afin de mieux adapter ces données, le composant vert est divisé en deux parties pour l'ajustement. Une partie est en dessous de 6600K, l'autre partie est au-dessus de 6600K.

Après cela, j'ai divisé les données en composants de couleur indépendants et les ai ajustés. (À l'exclusion des données qui sont toujours 0 et 255). Idéalement, une courbe passera par chaque point de données. Mais la réalité n'est souvent pas aussi idéale. Parce que pour les données de l'axe X et de l'axe Y dans la figure ci-dessus, leurs valeurs sont trop différentes. Les valeurs sur l'axe X sont toutes supérieures à 1000. Pour l'axe Y, les valeurs vont de 0 à 255. Nous devons effectuer les transformations correspondantes sur les données de l'axe X pour mieux effectuer l'ajustement de la courbe. Afin d'obtenir le meilleur ajustement, j'ai divisé les données de l'axe X par 100 et je les ai décalées en conséquence. Voici la distribution des données et la courbe d'ajustement optimale de chaque composant:

Comme mentionné ci-dessus, la courbe s'adapte bien.

Implémentation d'algorithme

Voici le pseudo code pour l'implémentation de l'algorithme:

Input: 1000K to 40000K color temperature the variable of color temperature and color component must be double precision Set Temperature = Temperature 100 Calculate Red: If Temperature <= 66 Then Red = 255 Else Red = Temperature - 60 Red = 329.698727446 * (Red ^ -0.1332047592) If Red 255 Then Red = 255 End If Calculate Green: If Temperature <= 66 Then Green = Temperature Green = 99.4708025861 * Ln(Green) - 161.1195681661 If Green 255 Then Green = 255 Else Green = Temperature - 60 Green = 288.1221695283 * (Green ^ -0.0755148492) If Green 255 Then Green = 255 End If Calculate Blue: 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 255 Then Blue = 255 End If End If

Dans le pseudo-code ci-dessus, Ln () représente le logarithme naturel.

Ce qui suit est l'implémentation du code de VB. Le code suivant n'est pas optimisé, mais le code est court et lisible.

Static tmpCalc As Double 'Temperature must fall between 1000 and 40000 degrees If tmpKelvin 40000 Then tmpKelvin = 40000 'All calculations require tmpKelvin 100, so only do the conversion once tmpKelvin = tmpKelvin 100 'Calculate each color in turn 'First: red If tmpKelvin <= 66 Then r = 255 Else 'Note: the R-squared value for this approximation is .988 tmpCalc = tmpKelvin - 60 tmpCalc = 329.698727446 * (tmpCalc ^ -0.1332047592) r = tmpCalc If r 255 Then r = 255 End If 'Second: green If tmpKelvin <= 66 Then 'Note: the R-squared value for this approximation is .996 tmpCalc = tmpKelvin tmpCalc = 99.4708025861 * Log(tmpCalc) - 161.1195681661 g = tmpCalc If g 255 Then g = 255 Else 'Note: the R-squared value for this approximation is .987 tmpCalc = tmpKelvin - 60 tmpCalc = 288.1221695283 * (tmpCalc ^ -0.0755148492) g = tmpCalc If g 255 Then g = 255 End If 'Third: blue If tmpKelvin>= 66 Then b = 255 ElseIf tmpKelvin <= 19 Then b = 0 Else 'Note: the R-squared value for this approximation is .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

Effet d'algorithme:

La figure suivante est le diagramme des effets de l'algorithme de réglage de la température de couleur. Le côté gauche est l'image d'origine, il y a une image après avoir testé l'algorithme de réglage de la température de couleur ci-dessus.

L'effet réel obtenu dans l'outil est indiqué ci-dessous:

Traduction facultative en: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/