2010年12月04日

HSV - HSVの各値からRGBを求める

WikipediaのHSVのページを見ながらプログラムを書いていて、説明不足なところを見つけたから報告。ついでに、作った関数も公開しとく。(これ見ても今週の課題のヒントにはならないぜ!)

下のコードの256階調に戻す操作をしないと、ちゃんと色が出ない。Wikipedia にはこの説明がなかったから HSV から RGB に変換するときは気をつけてね。

/*
  引数 H, S, V から RGB 値を求めて
  引数で受け取ったポインタ *R, *G, *B に格納する
*/
void rgb(double H, double S, double V,
     unsigned char *R, unsigned char *G, unsigned char *B)
{
  int Hi;
  double f, p, q, t;

  Hi = ((int)(H / 60)) % 6;
  f = H / 60 - Hi;
  p = V * (1 - S);
  q = V * (1 - f * S);
  t = V * (1 - (1 - f) * S);

  // 256階調に戻す
  V *= 255;
  p *= 255;
  q *= 255;
  t *= 255;

  switch (Hi) {
    case 0: *R = V; *G = t; *B = p; break;
    case 1: *R = q; *G = V; *B = p; break;
    case 2: *R = p; *G = V; *B = t; break;
    case 3: *R = p; *G = q; *B = V; break;
    case 4: *R = t; *G = p; *B = V; break;
    case 5: *R = V; *G = p; *B = q; break;
  }
}

ちなみに、俺が適当に選んだ数値で計算してみたところ、10進数で誤差 0.1 以下だったよ。



add20 at 17:37コメント(5)トラックバック(0)C言語  
RSSを購読
はてなブックマークに登録

トラックバックURL

コメント一覧

1. Posted by RYU   2010年12月04日 20:27
おおー、すごい。
てか今回の課題にどうやってHSVを適用させればいいんだろう?

 RGBをある関数が受け取る
→それをHSVに変換してメイン関数に返す
→メインの方で切り抜く色範囲をHSVで指定する 
(RGBより楽?これがメリット?)
→RGBに戻して描画

ってやるのかな。
なんかRGBだけでやってもそんなに変わらない気がするんだけれど・・・
2. Posted by add20   2010年12月04日 21:56
流れはそんな感じ。

確かに今回の課題だとRGBでやるときとさほどかわらないかもね。

あえて言えば、細かい修正が楽になる。かな。

でも、画像の色を編集するときとかはHSVのありがたみがものすごいわかるよ。
俺今日やってみたけど、感動した。色の選び方の楽さと編集のしやすさに。
3. Posted by RYU   2010年12月04日 23:43
ふむ、細かい修正か・・・

HSVで画像編集する方法の具体的なイメージが浮かばないから今度教えてくれ´Д`
4. Posted by add20   2010年12月05日 10:37
OK

画像編集っていってもHSVでできるのは色の操作だけだけどね。
5. Posted by 通りすがり   2014年09月30日 00:40
ありがとう参考になりました

コメントする

名前
URL
 
  絵文字
 
 
最新コメント
記事検索
QRコード
QRコード
  • ライブドアブログ