情報工学実験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のソースコードと実行結果
| |
[戻る]