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


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

回答の条件
  • 1人2回まで
  • 登録:2008/02/21 13:18:59
  • 終了:2008/02/28 13:20:03

回答(3件)

id:haruo-31 No.1

haruo-31回答回数80ベストアンサー獲得回数102008/02/21 13:55:57

ポイント27pt

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

黒⇒青⇒紫⇒赤⇒黄⇒白 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)

id:ysog

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

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

うーん

2008/02/21 16:22:51
id:hidering No.2

hidering回答回数59ベストアンサー獲得回数32008/02/21 14:17:15

ポイント27pt

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

id:ysog

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

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

2008/02/21 16:43:44
id:ANSUKOEMU No.3

ANSUKOEMU回答回数12ベストアンサー獲得回数02008/02/21 21:10:44

ポイント26pt

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の値を求めるところまでなら

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

id:ysog

なるほどそう来ましたか

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

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

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

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

-----

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

2008/02/22 03:21:58

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • 逆さ眼鏡:フィルタ追加 昨日作った”蛙の眼”デジタル逆さ眼鏡にフィルタを追加。これはサーモグラフィ風に見えるような変換をかけたもの。それっぽく見える。参考にしたのはここ:
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません