伊達
>>
gnuplot で画像を表示
以下の方法は,古い gnuplot では動きませんので, その場合, こちらの方法を実行してください. なお gnuplot は発展しつづけております. demo スクリプトを一通り試されるといいでしょう.
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年,年々,改良が進んでいる gnuplot や latex は素晴らしい. このような,将来,多くの人が成果を再利用できる生産性のあるソフトウェアがもっともっと普及して欲しい.
画像の表示についてより深く学びたい人は Linuxによる画像処理プログラミング(飯尾淳 著) をお薦めします.