[[SJE2007]]
*画像をベクトルとして扱おう part2 [#kb999fde]
-サンプルデータ(学内アクセス限定,このデータはこの数理情報演習以外の用途で使ってはいけません)[[face96x96x100>http://tortoise1.math.ryukoku.ac.jp/~takataka/course2007/sje/gakunai/face96x96x100]]
-Javaのプログラム(学内アクセス限定)
[[Mat2PGM.java>http://tortoise1.math.ryukoku.ac.jp/~takataka/course2007/sje/gakunai/Mat2PGM.java]]
**行列から画像群へ [#l0c1b38f]
-上記のサンプルデータとJavaのプログラムをダウンロードし,次のように実行してみなさい.
$ java Mat2PGM face96x96x100 96 96 100 0 hoge
-上記を実行すると,カレントディレクトリに hoge000.pgm 〜 hoge099.pgm という100枚の画像ができる.確認しなさい.
-Mat2PGMを引数なしで実行すると,引数の説明が表示される
#pre{{
$ java Mat2PGM
usage: java Mat2PGM fnmat width height nimg mode
fnmat: filename of the input data matrix → 入力となる行列データのファイル名
width: width of the output image → その1行を画像に変換する際の画像の幅
height: height of the output image → 同じく画像の高さ
nimg: number of the images → 画像の枚数
mode: 0: scaling OFF, 1: scaling ON → スケーリングするかしないか
fnimg: filename of the output images → 出力するPGMファイルの名前(の先頭部分)
}}
スケーリングをONにすると,行列の各成分が正の値も負の値もとると仮定し,0が画素値127になるように,行毎の絶対値の最大値が0または255になるように定数倍する処理を行う.単位固有ベクトルを画像に変換する際などに必要となる.
**octaveで平均顔を作ってみよう [#he6c4a68]
-face96x96x100 を octave で読み込み,どんなサイズの行列か確認しなさい
-そこから平均ベクトルを求めてファイルに出力し,PGM画像に変換してみなさい
-face96x96x100 の最初の50枚は女性,残りの50枚は男性である.以下を参考に,女性平均顔,男性平均顔を作ってみなさい.
#pre{{
octave:17> a = [11,22,33,44; 55,66,77,88; 99,10,11,12]
a =
11 22 33 44
55 66 77 88
99 10 11 12
octave:19> a(2:3, :)
ans =
55 66 77 88
99 10 11 12
octave:20> a(:, 2:3)
ans =
22 33
66 77
10 11
}}