1. 画像の取り扱い

1.1 準備

1.1.1 授業で扱う画像のファイル形式

階調数
色数
階調値のファイル
記述形式
名称
マジック
ナンバー
2
モノクロ
ASCII
PBM  ASCII
P1
任意
モノクロ ASCII
PGM ASCII P2
任意
カラー(R,G, B)
ASCII
PPM ASCII P3
2 モノクロ BINARY
PBM BINARY
P4
任意 モノクロ BINARY
PGM BINARY
P5
任意 カラー(R,G, B) BINARY
PPM BINARY
P6
マ ジックナンバー
縦画素数 横方向画素数
最大階調値(階調数-1)
#コメント(適宜。なくてもよい)
・・・・以下階調値
P1
# feep.pbm
24 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0
0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

P3
# feep.ppm
4 4
15
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0

1.1.2 画像の表示、プログラムのコンパイル 


1.1.3 作業ディレクトリの作成

$ cd
$ mkdir image
$ cd image
$ mkdir e1
$ cd e1

1.1.4 PBM 作成テスト

  $ touch e101.pbm

P1
5 5
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0


1.1.5 gimp による画像表示

1.1.6 形式変換

$ ppmtogif e101.pbm > e101.gif

1.2 C言語による画像の取り扱い


unsigned char image [枚数][x方向のサイズ][y方向のサイズ]
image[0][200][100]   0枚目の画像の座標(200, 100)の画像の諧調値


1.3 画像入出力関数
#include "pgmlib.h"

/* 定数宣言 */
#define MAX_IMAGESIZE        1280 /* 想定する縦・横の最大画素数 */
#define MAX_BRIGHTNESS       255 /* 想定する最大階調値 */
#define GRAYLEVEL            256 /* 想定する階調数(=最大階調値+1) */
#define MAX_FILENAME         256 /* 想定するファイル名の最大長 */
#define MAX_BUFFERSIZE       256 /* 利用するバッファ最大長 */
#define MAX_NUM_OF_IMAGES      5 /* 利用する画像の枚数 */

/* 階調画像を入力する関数 */
void load_image( int n, char name[] );
  /* n:画像番号,name[]:ファイル名(""のときはキーボード入力)*/

/* 階調画像を出力する関数*/
void save_image( int n, char name[] );
  /* n:画像番号,name[]:ファイル名(""のときはキーボード入力)*/

/* 階調画像をコピーする関数*/
void copy_image( int n1, int n2 );
  /* 画像No.n1 を 画像No.n2にコピーする */

/* 階調画像を初期化する関数*/
void init_image( int n, unsigned char value );
  /* 画像No.nの全画素の階調値を強制的にvalue(0〜255)にする */

1.3 pgm, ppm画像の入出力プログラム例(2値化)

/* brighten.c  このプログラムの名前 */
#include<stdio.h>
#include"pgmlib.h"
/* 画像 No.n を shift だけ明るくする */
void brighten( int n, int shift );
int main(void)
{
load_image( 0, "" ); /* ファイル → 画像No.0 */
brighten( 0, 100 ); /* 画像No.0 の明るさを100上げる */
save_image( 0, "" ); /* 画像No.0 → ファイル */
return 0;
}
void brighten( int n, int shift )
/* 画像 No.n を shift だけ明るくする */
{
int x,y,brightness;
for(y=0;y<height[n];y++)
for(x=0;x<width[n];x++){
brightness = image[n][x][y] + shift;
if ( brightness > 255 ) brightness = 255;
image[n][x][y] = brightness;
 }
$ ./brighten
入力ファイル名 (*.pgm) : test.pgm
横の画素数 = 320, 縦の画素数 = 240
最大階調値 = 255
画像は正常に読み込まれました.
出力ファイル名 (*.pgm) : out.pgm
画像は正常に出力されました.


課題1

以下の課題を実施して提出してください。


追記:情報処理で学習したとおり、メールの本文はビジネスメールの要領で作成してください。下記のような感じです。

    ***先生

   ***です。****を提出します。
   よろしくお願いします


提出要領:

1.  以下の作業を実行して作成される
x101.pgm, x101.gifをメールに添付してください。 2.brighten.cを参考にして、256階調のグ レースケール画像の明暗を反転するプログラム reverse.c を作成しなさい。答えにはプログラムと、test.pgmを入力としたときの出力画像out1.pgmを含めてください。

[コンパイル、実行の仕方]
% gcc reverse.c  -o reverse    (コンパイル,pgmlib.hも必要
%  ./reverse                                 (以降のプログラムも同様)

3. brighten.c
を参考にして、256階調のグレースケール画像の幾何学的な上下左右を反転するプログラム tb.c を作成しなさい。答えにはプログラムとtest.pgmを入力としたときの、出力画像 を含めてください。


---------------------------------------------------------------------------------------------------------------------------------------------------------
余力の有る人は下記もやってみてください。(教科書に掲載)

n枚の画像の平均値を出力する
90°回転した画像を出力する。