情報工学実験U: 課題1: 画像の色を反転させる・暗くする

課題1-1
ppm形式の画像ファイルを読み込み,各ピクセルの赤の輝度,緑の輝度,青の輝度を,
すべて反転させた後の画像のデータを,ppm形式のファイルとして作成しなさい.


<<課題1-1のヒント>>

 [バイトとは?]
● コンピュータで扱うすべてのファイルは,バイト(byte)と呼ばれる情報の単位の集まりです.
● 1バイトは,0か1が8個並んだ列です.例えば,「01101001」は,1バイトの情報のひとつの例です.

 問題1-1) 1バイトの情報によって,いくらからいくらまでの数を表すことができるでしょうか?

● この0か1かの情報ひとつひとつは,ビット(bit)と呼びます.つまり,1バイト=8ビットです.

 [画像情報とは?]
● コンピュータで扱う画像は,たくさんの色のつぶつぶから成っています.このつぶつぶを,ピクセル(pixel)と言います.
● カラー画像の1ピクセルは,3バイトの情報を含みます.
● この3バイトの情報は,赤(red)緑(green)青(blue)という, 光の3原色それぞれの強さ(輝度)を,0から255の数値で表しています.

 問題1-2) 1ピクセルは,何通りの色を表すことができるでしょうか?

 [ppm形式の画像ファイルとは?]
● ppm形式の画像ファイルの内容は,次のようになっています.

 1行目:ファイルの形式を示す文字列
  ・・・ 「P6」という文字列のはず.

 2行目:画像の幅(width)と高さ(height)を示す文字列
  ・・・ 空白で区切られて,二つの文字列が並んでいるはず.「128 128」など.

 3行目:画像に含まれる3原色の最大の強さを示す文字列
  ・・・ 普通は「255」になっているはず.

 4行目:画像のピクセルひとつひとつについて,RGBそれぞれの輝度情報を示すバイト列
  ・・・ つまり,4行目以降のデータの総量は,総ピクセル数の3倍のバイト数になっています.
  ・・・ ピクセル・データの並び順は,画像の左上から始めて,横方向に右端まで進んだら1ピクセルずつ下がる,という順です.

● ppmファイルの最初の3行,つまり文字列の部分は,テキスト・エディタやlessコマンドで読むことができます.
● しかし,4行目以降,つまりバイト列の部分は,直接読むことができません
 ・・・ 人間が読めない部分を含むファイルを,バイナリ・ファイルと呼びます.
 ・・・ 人間が読めない部分のデータを,バイナリ・データと呼びます.

● C言語で,テキストを一行ずつ読み書きするにはfgetsやfputsという関数を使います.
● C言語で,バイナリ・データを読み書きするにはfreadやfwriteという関数を使います.

 [輝度を反転させるには?]
● 輝度を反転させるとは,明暗を完全に逆にする,ということです.
● 最大輝度が,赤・緑・青,いずれも255ですので,元の輝度を255から引き算すれば,明暗が完全に逆になります.
● プログラムが正しく動くかどうかをチェックするには
cat image_data/0.ppm | ./ex1-1 > new0.ppm
と,コマンド・プロンプトから入力し,「new0.ppm」というファイルが,「0.ppm」の色を反転させた画像になっているかどうか,直接見てみればよいでしょう.



課題1-2
ppm形式の画像ファイルを読み込み,各ピクセルの赤の輝度,緑の輝度,青の輝度を,
半分の値にした後の画像のデータを,ppm形式のファイルとして作成しなさい.


<<課題1-2のヒント>>

● 輝度を半分の値にするには,文字通り,2で割ればいいのです.
● 輝度が半分になるので,元の画像よりも,かなり暗い画像になるはずです.
● プログラムが正しく動くかどうかをチェックするには
cat image_data/0.ppm | ./ex1-2 > new0.ppm
と,コマンド・プロンプトから入力し,「new0.ppm」というファイルが,「0.ppm」の画像より暗くなっているかどうか,直接見てみればよいでしょう.




提出すべきもの
問題1-1,1-2の答え
課題1-1,1-2のソースコードと実行結果

[戻る]