2015年8月26日水曜日

C#で熱画像っぽい色合いを作る その2

前回、IFとかで熱画像っぽい色を無理やり作って満足していたのだが、どうにも物足りなくなってきた。というのは、本家FLIRの熱画像が素晴らしかったからだ。

この画像は本家FLIRの熱画像のスケールをスペクトル解析したもの。赤、緑、青と、輝度が表示されている。白い輝度の線を見ればわかるが、綺麗に直線になっているのだ。つまり「輝度でモノクロ化」した場合に、熱画像が綺麗に白黒になる。これはカラーで作成した資料を白黒でコピーした場合に大きく力を発揮するだろう。


そして僕が作ったのがこちら。
前回よりは若干直線性が増していると思う。しかしまだ完全ではない。

次にこの色をつくるための計算式だ。

Rf = 0.05 + Math.Sin(Value * 1.8 - 0.05) * 0.9;
Gf = 0.5 + Math.Sin((Value + 1.4) * 3.2) * 0.4;
Bf = 0.5 + Math.Sin(Value * 1.6 - 1) * 0.7 + Math.Sin(Value * 6 + 0.4) * 0.5;

たったこれだけである。前回のIF処理のネストは何だったのか。でも三角関数を使えば三角波なども作れるようなので、三角関数の組み合わせで遊ぶのは結構楽しい。

上記の計算だが、赤と緑は1)オフセット、2)位相、3)周期、4)振幅の4個のパラメータで構成されている。青は上記に位相、周期、振幅がもう1セット加わった7個のパラメーターとなる。人間の手で調整するのは大変だが、目的の形をプログラムで判定することができれば総当りで最適な計算式を作れるかもしれない。特に直線性は総当りで調べて行ったほうが簡単に作れる気がする。ただ、直線性だけを見たのでは熱画像風に使えるとは限らないので、候補を幾つか作らせて人間が確認する、ということになるだろうが。

とにかく、今回わかったことは、IFなんて使わなくていい ということだ。パラメータを調整するだけで任意のスペクトルを作れるんだから、次はもうちょっと最適化した計算を報告できるようにしたい。

0 件のコメント:

コメントを投稿