LoginSignup
2
1

C# で カラーバー を作ってみた

Last updated at Posted at 2022-11-15

変更履歴

  • 2022年11月22日:Ver0.2.0 リリースに伴い内容を修正
  • 2022年11月29日:Ver0.3.0 リリースに伴いガンマ補正の記述を追加
  • 2023年01月27日:Ver1.0.0 リリース(ColorBarLib自体に問題がなさそうなので)
  • 2023年02月14日:Ver1.1.0 リリース (バグフィックス)
  • 2023年11月08日:タグに heatmap を追加(ヒートマップて言うのか…)

動機

元々 Gnuplot でサーモグラフィーみたいな2D画像を作成していました。
しかし出力データを「テキスト出力 → ProcessでGnuplot起動」の手順じゃないと出来ないため、とても遅いです。
どうにかならんかと思い作ってみました。

作成イメージ(OpenCVSharp4を利用)

イメージ RGB指定
Sample1.png #FF0000, #FFFF00, #00FF00, #00FFFF, #0000FF, #FF00FF, #FF0000
Sample2.png #000090, #000FFF, #0090FF, #0FFFEE, #FFFFFF, #FFEE00, #FF7000, #EE0000, #7F0000
サーモグラフィー.png #000088,#0000FF,#00FFFF,#FFFF00,#FF0000,#FFFFFF

使い方

Githubソース内のExcample を見るのが早いと思います。
カラーバー作成と表示画像作成でやり方が微妙に事るので…

使い方の例:

グレースケール
colorPalette = new()
{
    MinValue = 0,
    MaxValue = 255
};
// 上記指定したプロパティ値を利用
Color color = colorPalette.GetRGBColor(value);
// または上記指定したプロパティ値を無視し、最大値・最小値を指定
// Color color = colorPalette.GetRGBColor(value, minValue, maxValue);
カラー
ColorPalette colorPalette = new("#FF0000, #FFFF00, #00FF00, #00FFFF, #0000FF, #FF00FF, #FF0000")
{
    MinValue = 0,
    MaxValue = 255
};
// 上記指定したプロパティ値を利用
Color color = colorPalette.GetRGBColor(value);
// または上記指定したプロパティ値を無視し、最大値・最小値を指定
// Color color = colorPalette.GetRGBColor(value, minValue, maxValue);

簡単な説明

  1. コンストラクタでRGBカラーのリストからカラーパレットを作成します。
  2. GetRGBColor() メソッドで実際の値がカラーパレットのどの色に該当するかを探し出します
  3. コンストラクタの色指定無しにするとグレースケール(ガンマ補正有り)になります。
  4. 色指定を「#000000,#FFFFFF」にするとグレースケール(ガンマ補正無し)になります。
  5. 画像作成時の最大値・最小値は画像のビット単位最大・最小値を指定する
  6. カラーバー作成時の最大値・最小値は表示位置(XまたはY軸)の最大・最小値を指定する

その他

  • 最大値・最小値はマイナス値も対応してます
  • 最大値・最小値は小数点でも行けるはずです(サンプル画面では数値入力後にマイナスを付与)
  • ライブラリ自体は Color を使っているので、.net3.5 レベルまで落としても動くのでは?(責任持ちません)
  • 1つ1つは難しい事をしてないので、Java変換も行けるはず…
  • なんでこれ系はPythonばっかりなんだよっ!

課題・問題点

  1. グレースケールのカラーバーは良いのですが、実際の画像を出力した場合Gnuplot よりも暗めになりました。何かが間違っているんだろうが…
     → 調べた結果Gnuplotでは「ガンマ補正」を行っているようなので、同じようにガンマ補正を行うように変更しました。数値はGnuplotと同じ1.5を利用しています。
  2. 「ColorPalette」クラスの名前が、「System.Drawing.Imaging.ColorPalette」と被ってる…変更せねば…
     → コメントの @albireoさん の提案に合わせてクラス名を「ColorBarPalette」に変更しました。
  3. 【2022/11/21追記】HSLで作成しているから処理が複雑化してる?HSVにすればもっと簡単になるかも…?
  4. この後なにも無ければバージョン1.0にする。
     → 2023年01月27日リリース
  5. RGB画像を対応するCSVファイルにする機能を入れるか…別EXEにするか…(ってかこれはその辺に落ちてるアプリで十分か……)
  6. サンプル画面を英語で作るのが面倒になってきた…

Github

終わりに

今回はサーモグラフィーのような画像作成を目的として探しましたが、グラフや画像作るコードを探すと Python ばっかりな気がする…
またはGnuplotのような実行形式のもので、DLL形式のものを見つけられなかった…
昔はたくさんあったのかもしれないが、どこへ行ったのか…

ちなみに、約3000 × 2000 (ピクセル)ぐらいの画像作成が、Gnuplot(テキストファイル出力~画像ファイル作成まで)で約8秒 だったのが、約2秒まで減らせました。
やはりファイルI/Oを無くすのは速度にとって重要ですね。

なお、初投稿なので良くない記載があれば教えて頂けると嬉しいです。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1