さて今回は擬似カラーについて記事を書こうと思う。
記事を書くというよりプログラムを載せるかな
擬似カラー
擬似カラーとはデータを可視化する際に、数値の変わりに
色でデータを表現することで、データの特徴を分かりやすく把握することができる大変便利な物である。
文章で説明するより見てもらったほうが分かりやすいと思うから一応図を
これが擬似カラーであらわしたアヒルの図となる。
今回はZ値が大きいほど(右)青い色で、Z値が小さい(左)ほど赤になるように設定している。
実装する擬似カラー
今回実装する擬似カラーはいつもお世話になっている
画像ソリューションさんのページに記載されている擬似カラーである。
このページの上から2つ目のグラフの擬似カラーですね。
プログラム
プログラムは下記参照で
あんまり複雑な処理は行っていないので、各自見て理解していただきたい。
SetPseudoColorであらかじめ値を設定しておいて、その値をGetPseudoColorで取得
してもらえれば使うことができる。
ちなみにここで扱っているVector3クラスはOpenTKクラスのものです。
public static Vector3[] RGB = new Vector3[256];
private void SetPseudoColor()
{
float scale = 4;
for (int i = 0; i < 256; i++)
{
if (i <= 63)
{
RGB[i].X = 0 / 255.0f;
RGB[i].Y = scale * i / 255.0f;
RGB[i].Z = 255 / 255.0f;
continue;
}
if (i <= 127)
{
RGB[i].X = 0 / 255.0f;
RGB[i].Y = 255 / 255.0f;
RGB[i].Z = (255 - (scale * (i - 64))) / 255.0f;
continue;
}
if (i <= 191)
{
RGB[i].X = (scale * (i - 127)) / 255.0f;
RGB[i].Y = 255 / 255.0f;
RGB[i].Z = 0 / 255.0f;
continue;
}
if (i <= 255)
{
RGB[i].X = 255 / 255.0f;
RGB[i].Y = (255 - (scale * (i - 192))) / 255.0f;
RGB[i].Z = 0 / 255.0f;
continue;
}
}
}
public static Vector3 GetPseudoColor(float value,float min,float max)
{
if(max < value)
{
return RGB[255];
}
if (min > value)
{
return RGB[0];
}
float length = max - min;
float scale = 255 * (value - min) / length;
return RGB[(int)scale];
}
注意点
今回のGetPseudoColor関数では、線形に値を取得するようになってます。
そのため、値が
例:[0,1,2,3,4,5,100,200,100000];
といいうように最大値だけが異常に大きい、または最小値だけが異常に小さいとなった
場合、色が偏ってしまいます。
上の例の場合、1点だけ真っ赤、それ以外は真っ青というような感じです。
これでは擬似カラーを使っても何の意味もないです。
こういうのを回避するために、非線形で色値を取得するようにしてみたり、
例外処理を加えてみる等してGetPseudoColor関数を自分のデータにあわせた関数に変更してください。