C言語による画像処理: フォールスカラー合成
筑波大学農林工学系 奈佐原(西田)顕郎
前回見たように, カラー画像は, 各カラーチャンネルを自由に配置することで多様な画像を合成できます。
そこで, 任意の3枚のモノクロ画像を, RGBの各チャンネルに配置することで, 仮想的なカラー合成画像を作ることができます。そのような画像は現実の画像ではないので「フォールスカラー画像」とよばれ, ものごとの観察に非常に有用です。
ここでは, フォールスカラー画像の例として, 森林の季節変化を観察してみましょう:
まずこのファイル2004_TKY_ppm.tar.gzをダウンロードして展開してください。これは岐阜県高山市にある, 森林生態観測サイトで観測された, 2004年春の芽吹きの時季の, 定点での樹冠全天魚眼画像です。
2004_144_TKY_f02u.ppm DOY144(5/23)の画像 2004_149_TKY_f02u.ppm DOY149(5/28)の画像 2004_154_TKY_f02u.ppm DOY154(6/02)の画像
これらをそれぞれ, 3チャンネルの平均化によってモノクロ画像に変換してください。
次に, 3時期のモノクロ画像を, それぞれ赤・緑・青に割り当てて合成画像を作ってください。ヒント:3つのファイルを同時に開くには, 標準入力は使えない。かわりに,
FILE *fp1, *fp2, *fp3; ..... fp1=fopen("2004_144_TKY_f02u_bw.pgm", "rb"); fp2=fopen("2004_149_TKY_f02u_bw.pgm", "rb"); fp3=fopen("2004_154_TKY_f02u_bw.pgm", "rb"); ..... fread(&data[0], 1, 1, fp1); fread(&data[1], 1, 1, fp2); fread(&data[2], 1, 1, fp3); ..... fclose(fp1); fclose(fp2); fclose(fp3);
のようにする。*fp1などは「ファイルポインタ」と呼ばれ, これまでのstdinなどと同様の働きをする。fopenは, ファイルポインタにファイルを割り当てる。その中のrbは, read binaryの略。ファイルポインタを使ってファイルを読み書きしたあとは, fcloseでファイルを閉じること。
質問: ファイルポインタがいまいちピンときません。
回答: ファイルポインタはそれ自体はデータではありません。データがファイルから読み込まれてくるときの出口というか蛇口みたいなものです。ファイルポインタを介して, 芋づる式にデータが流れてくるのです。
フォールスカラー画像。5/23赤 5/28緑 6/02青。
赤く見える葉は, 5/23では明るく(空), 5/28以降は暗く(葉のめぶき)なっていたことがわかるので, 5/23から5/28の間に出た葉であることがわかります。黒く見える葉は, 最初からずっと暗かったということなので, 5/23以前から芽吹いていた葉です。
質問: fread(&data[0], 1, 1, fp1); の&をつけている意味を教えてもらいたいです。
回答: まず, 変数の「アドレス」という概念を理解しましょう。&data[0]は, data[0]という変数のアドレスを意味します。fread関数は, 第一引数に, データを格納するアドレスを指定します。だから&が必要。
質問: fread関数は, 第一引数に&をつけないこともあるので気になって質問しました。
回答: 第一引数に&をつけないのは, 「ポインタ変数」の場合です。unsigned char data[3]; と定義されたdataは, 「要素数3の配列変数」であり, 「ポインタ変数」でもあります。この場合, dataと&data[0]は同じ意味を持ちます。こちらなどが参考になります。
質問: dataと書くと自然に&data[0]と同じことを意味する。data+1と&data[1]は同じ意味をもつ。という認識で大丈夫でしょうか?
回答: 大丈夫です。
Keyword(s):
References:[画像解析入門]