C言語による画像処理: 明るさの調整・GIFアニメ
筑波大学農林工学系 奈佐原(西田)顕郎
前回見たように, カラー画像は, 各ピクセルの各カラーチャンネルの明るさで構成されています。その値が大きければ明るく, 小さければ暗い。ということは, 画像全体にわたって, 各ピクセル・各カラーチャンネルの値を大きくすれば明るい画像になるし, 小さくすれば暗い画像になるでしょう。
そこで, あたえられたカラー画像に対して, 各ピクセル・各カラーチャンネルの値を, 任意の定数倍するプログラムを作ってみましょう。これはこれまで皆さんが作ったプログラムよりもアルゴリズムは簡単です。以下の仕様を満たすプログラムを作成してください:
- ソースコードのファイル名はbright.c, バイナリコードのファイル名はbrigtとする。
- 入力は, これまでのようにlake.ppmを想定して横800縦600ピクセルのppm画像とし, 標準入力から与える。
- 出力も横800縦600ピクセルのppm画像とし, 標準出力に出す。
- 原画像"lake.ppm"の明るさをx倍するとき, $ ./bright x < lake.ppm > lake_x.ppmのようにコマンドラインからxの値を与える。こちらを参考にして。
←原画像の半分の明るさ
←原画像の1.5倍の明るさ (注意:各ピクセルの各色の値は、255 (1byte) を越えてはいけない!!)
明るい画像を作ったとき, 空の色が変になったりしませんでしたか? おそらくそれはオーバーフローという現象です。本来は255までの数値であるべきなのに, 255を超えた値を無理やり代入すると, その数値表現がおかしいことになってしまうのです。これは, 画像処理で大変よく起こりがちなトラブルです。それはどのように解決すればよいでしょうか? 考えてみて下さい。
大量画像の自動処理
この処理を, 様々な倍率について, 繰り返しやってみましょう:
$ for i in 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0; do ./bright $i <lake.ppm > b${i}.ppm; done
こうすると, 0.2倍から2.0倍までの10とおりの倍率のそれぞれについて, 画像ができます:

GIFアニメーション
こうして作ったたくさんの画像を, 連続表示してアニメーションにしてみましょう。そのためには, ImageMagickというコマンドライン型の画像エディタのサブコマンドである, convertが非常に有用です:
$ convert b???.ppm -resize 400 -loop 0 b.gif $ firefox b.gif

→ 画像解析入門に戻る!
Keyword(s):
References:[画像解析入門]