Zonulog@はてな

2007-08-16

HSVからRGBへの変換

17:53

解析系の研究をやっているので,解析結果の表示機能(ポストプロセッサ)を自分で作ることもあります.

汎用のポストもあるのですが,それだとデータフォーマットを合わせたりなんだり,と解析の内部がまだゴタゴタしている段階では面倒くさい使いにかったりします.


そうすると,解析結果の値を色で表現するようになるのですが,いわゆるポストプロセッサの場合,解析結果をHSV系で表示しているように僕には見えます.

下のスクリーンショットは出来上がったものですが,イメージとしてはこんな感じにしたかったわけです.


thermo.png


しかし,OpenGLではピクセルのカラーはRGBで指定しなければならないので,データの値に基づいてHSVカラーを作成して,それをRGBに変換する作業が必要になります.


ここで,RGBHSVの色表現の違いですが,RGBは色を( RED, GREEN, BLUE)の光の三原色の成分の強さを,原則として0.0-1.0で表現します.

これに対して,HSVは色を以下の3つの組で表します.


Hsv_sample.png

figure. HSV color space

  • Hue : 色相角 (0.0 - 360.0)
  • Saturation : 彩度 (0 - 1.0)
  • Value( Brightness) : 明度 ( 0 - 1.0)


なぜ,これが解析結果の表示に向いているかというと,SaturationとValueを固定して,Hueを変化させるだけで,視覚的に大きな変化を作ることができるからです.


HSVでは,

  • ( H, S, V ) = ( 0,  1,  0 )で原色の赤
  • ( H, S, V ) = ( 120,  1,  0 )で原色の緑
  • ( H, S, V ) = ( 240,  1,  0 )で原色の青

を作り出せます.


これを利用して,解析結果の最大値を0.0,最小値を240.0とした数値をHueとして用いれば,最小値を青で,最大値を赤で表示することができ,中間値には緑や黄色も現れるので,RGBのどれかだけを変化させるよりも,視覚的な変化が大きくなります.


Wikipediaなどを参照すると,変換アルゴリズムを見つけることができます.


S≠0の場合,

Hi = floor( H / 60) mod 6

f = H / 60 - Hi

p = V ( 1 - S)

q = V ( 1 - f S)

t = V ( 1 - ( 1- f) S)


Hi = 0のとき,R=V, G=t, B=p

Hi = 1のとき,R=q, G=V, B=p

Hi = 2のとき,R=p, G=V, B=t

Hi = 3のとき,R=p, G=q, B=V

Hi = 4のとき,R=t, G=p, B=V

Hi = 5のとき,R=V, G=p, B=q


となります.


さらに中間値などでの色の変化を大きくしたい場合は,

解析値 -> 写像 -> HSVカラー -> RGBカラー

というように変換すれば,中間値での変化をより詳しく視覚的に捉えることができます.

トラックバック - http://d.hatena.ne.jp/Zonu/20070816/1187254439