« 最大公約数 - ユークリッドの互除法 | メイン | 関数オブジェクトの名前 »
2008年02月07日
日常の備忘録:: 色温度の導出
Tweet @jin1016をフォロー色温度という言葉は良く聞くけど、それが何かは良くわからなかった。
調べてみると、理想的な黒体がある温度において放射する光の色なんだとか。
よくある理想物体か。
まあ、それはどうでも良くて、ある温度での色がわかると炎や爆発などの色を作るときに都合が良い。
と思ったんだけど、どうも計算式で求められるものではなく、「黒体の絶対温度と色度座標との関係」というデータテーブルが存在し、そこから導出するっぽい。
でも、そのデータテーブルが見つけられなかったので、とりあえずこの色温度-色色雑学 | コニカミノルタのページのグラフから、交点っぽいところをリストアップして、このデータを基に近似式を作ることにした。
近似式は、xy色度図上の x と y の関係、ケルビンと x との関係を出し、ケルビンから x と y を求められるようにする。
ということで、このデータを Excel に入れて近似曲線を描かせる。
x と y の関係は、単純な2次の多項式近似でかなり近いものが出た。
※ ちなみに Excel のグラフの近似曲線は、近似曲線の書式設定のオプションの数式の表示にチェックを入れてやると数式を見ることが出来る。また、多項式近似は、Excel で回帰分析した結果と一致するようだ。
が、ケルビンとの関係は誤差が大きい。
いい近似曲線が出せない。
誤差が大きくてもいいかと思ったが、よくよく色温度の図を見てみるとケルビンは対数的な変化をしているように見える。
試しにケルビンの自然対数値を求め、それと x とのグラフを作ってやって3次の多項式近似で近似曲線を描くとかなり一致している。
ケルビンは対数値を取ってから求めた方が良さそうだ。
以上の方法で求めた近似式から出した色を描画すると以下のようになった。
範囲は、自然対数値で 7.0 ~ 10.0 。
ケルビンに直すと 1096K ~ 22026K 。
Wikipedia の 色温度 のカラーチャートと上の図はだいぶ似ていると思う。
ってことで、ケルビンから色温度の色を求めるソースは以下の通り。
#include <math.h> class ColorTemperture unsigned long ColorTemperture::GetColorLn( float K, float Y ) |
ケルビンとの関係で出したのは、Yxy 色空間の色なので、これは RGB 色空間に変換してやらないと使い辛い。
上のソースで呼んでいる色変換メソッドのソースは以下の通り。
//! 実数形式での色 |
ってことで、このソースがあればケルビンから色が出せる。
「黒体の絶対温度と色度座標との関係」というデータテーブルがどこにあるか知っている人がいたら教えてくれるとありがたいです。
上のソースでもかなり近いものが出ているけど、そのデータがあればもっと近づけられるはず。
まあ、ゲームなどの用途であれば上のソースでもなんら問題ないんだけど。
投稿者 Takenori : 2008年02月07日 23:01
コメント
黒体放射の式はこちら
http://ja.wikipedia.org/wiki/%E9%BB%92%E4%BD%93
スペクトルが得られるので、適当な等色関数を使えばX,Y,Zに直せますが...
標準光源の式を使うのが手っ取り早いでしょう
http://en.wikipedia.org/wiki/Standard_illuminant
あと、RGBにはガンマがかかっているので、Yxyと変換する際はリニアに戻してやらないと不正確です。
手前味噌ですがこちらもご参考になれば。
http://www.geocities.jp/aji_0/colormetrix.html
投稿者 あじ : 2008年02月28日 00:39
あじさん、こんにちは。
ありがとうございます。
やはり変換式が既にあったのですね。
そちらに直したいと思います。
ただ、RGBにはガンマがかかっていると言うのがよく理解できませんでした。
ガンマがかかっているかどうかは入力ソースによると思うのですが何か認識違いをしているのでしょうか?
もう少し調べてみようと思います。
それでは。
投稿者 Takenori : 2008年03月01日 14:15
PCで扱うRGBも、デジタル映像信号のYUVもみんな2.2~2.4のガンマがかかっています。
数字が変わるに従って、滑らかにグラデーションする場合はまずガンマがかかっています。
色彩工学的な数字の決め方をしていますので。
ですが、光学的な計算の場合はガンマ1.0でないといけません。
RGB⇔XYZの変換は光学的な変換なので、ガンマの補正が必要なのです。
・RGB(γ2.2)⇒XYZなら RGBを2.2乗してからRGB⇒XYZ変換、
・XYZ⇒RGB(γ2.2)なら XTZ⇒RGB変換してRGBを1/2.2乗
となります。
投稿者 あじ : 2008年03月03日 21:27
あじさん、こんばんは。
例えば、デジカメのRAWデータなどは、ガンマ補正がかかっていないと思います。
そこで引っかかっていました。
ほとんどのRGBデータにはガンマ補正がかかっているので、工学的な輝度値への変換が必要ということだったのですね。
つまり、Yxy から RGB へ変換してディスプレイで表示するためには、ガンマ補正もしくはトーンマッピングのような処理が必要であると。
理解できました。
ありがとうございます。
それでは。
投稿者 Takenori : 2008年03月03日 22:19
comments powered by Disqus