Mathematica7による固有顔、近似画像の実装例

202枚のテスト画像があると仮定。

  • メイン部分
(*固有ベクトルの計算*)
files = FileNames["*.jpg"];(*画像名リストの作成*)
images = Import[#]&/@files;(*画像の読み込み*)
faces = ImageData[#]*255 &/@ images;(*画素アクセス用に変換*)
AveFace = Total[faces]/202;(*202 枚の画像の平均顔を作成*)
Fdash = {# - AveFace} &/@ faces;(*各画像から平均顔をひいたデータf’*)
FdashAlpha = Flatten[#] &/@ Fdash;(*ベクトルに変換*)
{u,w,v} = SingularValueDecomposition[FdashAlpha];(*SVDを計算して固有ベクトルを計算*)
vt = Transpose[v];(*固有ベクトルの行列を転置*)

(*近似画像の作成*)
org = Import["image"];(*近似させる画像の読み込み*)
orgData = Flatten[ImageData[org]];(*ベクトルに変換*)
gg = Table[0,{202}];
For[i=1,i<=202,i++,gg[[i]]=vt[[i]]](*固有ベクトルのリストを作成*)

useN = 202;(*近似に使う画像枚数*)
ret = Flatten[AveFace]/255;
orgSubAve = orgData - ret;
For[i=1,i<=useN,i++,
ci = orgSubAve.gg[[i]];
ret += ci*gg[[i]]] (*ret に近似した画像ベクトルが入る*)
  • 画像の表示
(*基底画像の表示*)
g1 = Rescale[Partition[vt[[1]],50]]*255;
Image[Round[#]&/@g1,"Byte"]
  • 画像の出力
For[i = 1, i < 203, i++,
gx = Rescale[Partition[vt[[i]], 50]] * 255;
Export["eigen" <> ToString[i] <> ".jpg", Image[Round[#]&/@gx,"Byte"]]]
続きを読む

固有顔の作成手順

  1. テスト画像を用意する。(サイズとかそろえて1000枚ぐらい?)
  2. テスト画像の平均画像を計算する。(画素値が小数のデータ)
  3. 各テスト画像データから平均をひく。
  4. 上記の平均をひいたデータをベクトルに直し、共分散行列を求め固有ベクトルを計算。(この固有ベクトルが固有顔)

ただし、この固有ベクトルは正規直交系である必要がある。また、この計算は特異値分解(SVD)を用いることで計算可能。

最大流/最小カットのアルゴリズム

wikipedia(http://en.wikipedia.org/wiki/Maximum_flow_problem)に載ってた解法アルゴリズムは、

参考にした(ちゃんと読むべき)ページ、論文