Last modified: Sun May 3 18:27:14 JST 2009

伊達 >> gnuplot で画像を表示

gnuplot で画像を表示 (2009年新版)

目的

コンピュータ実験により得られた結果を画面に表示したい. ふつうの実験であれば,実験結果をファイルに書き込み,それをもとに図を描けばよい. なんの問題もない. ところが,扱う対象が画像になったとたん,面倒なことが発生する.

自分の与えられた環境で実行できて,できるだけ簡単な方法がよい. それに,今後,お金のないどんな劣悪な環境で仕事をしても実行できる方法がいい. このページでは普段 gnuplot を使っている人が, とりあえずの結果を比較的簡単に表示する方法を紹介する.

以下の方法は,古い gnuplot では動きませんので, その場合, こちらの方法を実行してください. なお gnuplot は発展しつづけております. demo スクリプトを一通り試されるといいでしょう.

サンプルコード

細かく説明するのも面倒なので, ともかく,以下のCのコードをコンパイルして実行してください. 最も応用の効くコードは gp090503image3.c です. ソースコードは短いので簡単に理解できるだろうと思います. 各ピクセルは unsigned char で表現していますが 必要な時は int や double 型に 適宜変更して使ってください.

基本的な考え方と利点

  1. 座標軸など深く考える必要はない.
  2. とりあえずの結果の表示には便利.

3x3 ピクセルの例

100
011
101
という画像!を表現したい場合.
% gnuplot
gnuplot> set yrange [] reverse
gnuplot> plot '-' matrix with image

1 0 0
0 1 1
1 0 1
e
e
と入力すれば,画像が表示される.

画像データを表示したい場合, 1次元の配列 img[i] に画像データを入れ 関数 write_2d_data を 呼び出せば,画像を描画してくれる関数を以下に示します. 表示するだけなら,あとは何も考えなくてよい(はず). 多数の小さい画像を並べて表示させたい場合は, 自分で大きい画像データ img[i] を作る必要があります. やさしい問題なので write_multi_images という名前で関数を作ってみてください.

#define N_XPIXELS 20
#define N_YPIXELS 20

/* write data for gnuplot */
void write_2d_data(unsigned char *img){

        int n_pixels = N_XPIXELS*N_YPIXELS;
        int i;

        for (i=0; i < n_pixels; i++){
                fprintf(gp, "%d ", img[i]);
                if (  (i+1)%N_XPIXELS  ==  0 ){
                        fprintf(gp, "\n");
                }
        }
}

例えば 8 x 8 ピクセルの画像(パッチ)25 枚を 5 x 5 段 で 表示したい場合,あらかじめ img[] という1つの配列に 自分でレイアウトした結果を書き込んでおけばよい. あらかじ画像パッチと画像パッチの上下と左右の 間隔を設定しておく必要がある.


たわごと

C言語で画像を処理する場合,結果の表示に手間取ることが多い. そのくらい,手間取れ! と言いたいところであるが, つまらないところに手間取らないよう, 大学の講義や研究では Matlab というソフトウェアが 使用される場合が多い(とくにアメリカでは). ただ,日本国内では購入価格も維持費も信じられないほど高い. そのせいなのか価格表も一般には公開されていない. Matlab 自身はよくできている (当研究室では1フロートライセンスだけ所有). そのため Matlab 互換を目指した FreeMat という素晴らしいオープンソースソフトウェアがある. ただ残念なことに,これを起動させるためには, Qt4 など,基盤となるソフトウェアをインストールする必要がある. だから,少し前の Linux では動かない.

画像の表示は gdk などを使えば綺麗に表示できるが, 比較的長いコードを書く必要があり, 慣れるまでに時間がかかる. このページでは普段 gnuplot を使っている人が, とりあえずの結果を比較的簡単に表示する方法を紹介した. C言語と gnuplot の環境はあるけれど, Matlab や FreeMat, R, octave がインストールされていない環境,つまり最も劣悪な環境でも仕事ができる方法を紹介した. 1990年頃のワークステーションでも動くはず.

ここ20年,年々,改良が進んでいる gnuplotlatex は素晴らしい. このような,将来,多くの人が成果を再利用できる生産性のあるソフトウェアがもっともっと普及して欲しい.

画像の表示についてより深く学びたい人は Linuxによる画像処理プログラミング(飯尾淳 著) をお薦めします.