色温度(ケルビン)からRGBへの変換:アルゴリズムとサンプル



Color Temperature Rgb Conversion



私の知る限り、色温度からRGBに変換するための信頼できる式を見つけることはほとんどありません。同様の機能を実現するアルゴリズムはたくさんありますが、それらのほとんどは色温度からXYZ色空間に変換されます。その後、必要に応じてXYZ空間からRGB色空間に変換できます。このアルゴリズムの実装はここにあります。

残念ながら、この方法は本当の意味での数式ではなく、美化されたルックアップテーブルの実装にすぎません。場合によっては、これは信頼できる方法です。ただし、XYZ-> RGB変換に関しては、この方法は単純なリアルタイムの色温度調整には遅すぎます。



そのため、色温度からRGBへの変換アルゴリズムのセットを実装しました。このアルゴリズム変換は非常に優れています。以下は私の考えの一部です。

このアルゴリズムを使用する際のいくつかの制限:

  1. 私のアルゴリズムは高精度の見積もりです。しかし、その精度はまだ科学研究には十分ではありません。このアルゴリズムは主に写真の一部の処理で使用されるため、天文学や医用画像処理の分野でこのアルゴリズムを使用しようとしないでください。
  2. アルゴリズムは比較的単純であるため、このアルゴリズムは適切なサイズの画像を処理するときに十分に高速です。ただし、より優れたリアルタイムパフォーマンスを得るには、使用するプログラミング言語を最適化するアルゴリズムを実装する必要があります。
  3. このアルゴリズムは、1000Kから40000Kへの色温度変換にのみ適しています。写真撮影では、このような広いスペクトル範囲で十分です。色温度がこの範囲を超えると、精度が低下します。

アルゴリズムの実装:サンプル出力

次の図は、1000Kから40000Kを出力するアルゴリズムの画像です。



次の写真は、写真撮影で関心のある色温度範囲です:1500Kから15000K



アルゴリズム実装のアイデア

私の最初の仕事は チャリティーの元の黒体の価値 信頼できる式を実現するためのリバースエンジニアリング。

チャリティーの元の黒体の価値 グラフ形式のデータは次のように表されます。

グラフからわかるように、いくつかの上限と下限があり、アルゴリズムの実装が容易になっています。特殊な:

  1. 赤いコンポーネントが6600K未満の場合、常に255を維持します
  2. 青い成分は2000Kで常に0のままです
  3. ブルーは255を6500K以上に保つように要求します

これらのデータをより適切に適合させるために、緑色のコンポーネントは適合のために2つの部分に分割されます。 1つの部分は6600K未満であり、他の部分は6600Kを超えています。

その後、データを独立した色成分に分割し、それらを適合させました。 (常に0と255であるデータを除く)。理想的には、曲線は各データポイントを通過します。しかし、現実はそれほど理想的ではないことがよくあります。上の図のX軸とY軸のデータでは、それらの値が大きすぎます。 X軸の値はすべて1000より大きいです。Y軸の場合、値の範囲は0〜255です。カーブフィッティングをより適切に実行するには、X軸データに対応する変換を行う必要があります。最適なフィットを実現するために、X軸データを100で除算し、それに応じてシフトしました。以下は、各コンポーネントのデータ分布と最適なフィッティング曲線です。

上記のように、曲線はうまく適合します。

アルゴリズムの実装

以下は、アルゴリズム実装の擬似コードです。

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

上記の擬似コードでは、Ln()は自然対数を表します。

以下は、VBのコード実装です。次のコードは最適化されていませんが、コードは短くて読みやすいものです。

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

アルゴリズム効果:

次の図は、色温度調整アルゴリズムの効果図です。左側は元の画像です。上記の色温度調整アルゴリズムをテストした後の画像があります。

ツールで達成される実際の効果を以下に示します。

オプションの翻訳: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/