人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

サーモグラフィー風に0?1の値をRGB値に変換したいのですがどのようにコーディングすればよいでしょうか?

例を挙げていただくとうれしいです。
とくに言語は限定しません。

1203567538
●拡大する

●質問者: ysog
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:RGB グラフ コーディング 言語
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● haruo-31
●27ポイント

こんな感じで如何でしょう?

黒⇒青⇒紫⇒赤⇒黄⇒白 1280階調

R G B

FFFFFF 1279

FFFF00 1023

FF0000 767

FF00FF 511

0000FF 255

000000 0

VBのコードです。(levelは0?1の実数)

単純に書いてます。エレガントなアルゴリズムは思い浮かびませんでした。

index = int(1280 * level)

group = int(index / 256)

select case group

case 0:

R=0

G=0

B=index

case 1:

R=index mod 256

G=0

B=255

case 2:

R=255

G=0

B=255 - index mod 256

case 3:

R=255

G=index mod 256

B=0

case 4:

R=255

G=255

B=index mod 256

case 5:

R=255

G=255

B=255

end select

Color = RGB(R,G,B)

◎質問者からの返答

動かしてみました、綺麗なグラデーションが出ましたが

画像と比べてみると微妙に違いますね

うーん


2 ● hidering
●27ポイント

HSV(HSB)色空間を用いれば綺麗にできますよ。

http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93

サーモグラフィ風のバーを作るのであればこんなイメージになります。

http://akebi.jp/bns/hsvp_manual.html

↑の(色相の)青から赤を使用すれば良いのではないでしょうか。

実装するには、彩度と明度を固定値にして色相を(0?1の)値によって変化させます。

0の場合は色相の青の値にして、1の場合は赤になるようプログラムすればよいわけです。

HSV→RGB、RGB→HSV変換のプログラムはこちらです。

http://laputa.cs.shinshu-u.ac.jp/~gtakano/prog3.html

◎質問者からの返答

彩度と明度を固定すると提示した画像のように濃?淡にならないように思います

また、赤は0.5付近で出てきているので1を赤にするのはちょっと違う気がするのです。


3 ● ANSUKOEMU
●26ポイント

RGBの変化を調べてみましたが、数式で表すのは結構面倒な感じでした。

0?1を適当な区間(たとえば10段階)に分けて各区切りのRGB値を取得しておき、

途中の値は補完してしまうという方法はどうでしょう。


とりあえず、10段階に分けて各点のRGB値を拾ってみました。(おおざっぱに0?250。)

0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
R 0 12 90 160 200 225 240 250 250 250 250
G 0 0 0 0 0 40 90 140 190 240 250
B 0 120 150 150 120 10 0 0 10 120 250

Bが複雑に変化しています。


ここで、たとえば0.54地点のGを求める場合を考えて見ます。

0.5地点=40と0.6地点=90の間の値で、ちょっと0.5地点寄り。

直線的に補完してしまって問題ないかと思いますので、

(90-40)=50の10分の4である20を0.5地点の値40に足した60が答え。


といった感じで、以下のプログラムにしてみました。

0?100(100も含む)の値について、カラーバーを書かせています。

言語はちょっとマイナーですが、手軽にこういう実験ができるHSPです。http://hsp.tv/

mtbl=10 /* 有効な区間の数 */
msub=10 /* 1区間の分割数 */

/* 配列代入(最後の1要素はエラー回避用)*/
tr= 0, 12, 90,160,200,225,240,250,250,250,250,250
tg= 0, 0, 0, 0, 0, 40, 90,140,190,240,250,250
tb= 0,120,150,150,120, 10, 0, 0, 10,120,250,250

cls 1:color 0,0,0:boxf 0,160,640,450

for x,0,mtbl*msub+1,1
 xa=x/msub
 xb=x\msub
 fr=tr(xa)+(tr(xa+1)-tr(xa))*xb/msub
 fg=tg(xa)+(tg(xa+1)-tg(xa))*xb/msub
 fb=tb(xa)+(tb(xa+1)-tb(xa))*xb/msub
 color fr,fg,fb:boxf 2,130-x,20,130-x
 /* RGBの値の変化を表示 */
 boxf x*4,140,x*4+3,150
 color 255,100,100:boxf x*4,450-fr,x*4+3,450-fr
 color 100,255,100:boxf x*4,450-fg,x*4+3,450-fg
 color 100,100,255:boxf x*4,450-fb,x*4+3,450-fb
next
stop

配列代入や余りをもとめる演算子に気をつければ、RGBの値を求めるところまでなら

他の言語に持っていくのも難しくないと思います。

◎質問者からの返答

なるほどそう来ましたか

殆ど同じ感じになりますね

とりあえず、これでやってみます。

HSPは始めて習得した言語ですが最近は使わなかったのでちょっと懐かしいです。

Ver3まで来たんですね。進化しすぎててびっくりしました。

-----

まだまだ他の実現方法の投稿をお待ちしてます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ