参考にしたもの
- 固有顔(http://ja.wikipedia.org/wiki/固有顔)
- 金谷先生「これなら分かる応用数学教室-最小二乗法からウェーブレットまで-」
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"]]]続きを読む
参考にした(ちゃんと読むべき)ページ、論文
- Boykov先生(http://www.csd.uwo.ca/~yuri/)
- 石川先生(http://hwm7.gyao.ne.jp/hihfs/indexJ.html)
- 最大フロー最小カット(http://ja.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E6%B5%81%E6%9C%80%E5%B0%8F%E3%82%AB%E3%83%83%E3%83%88%E5%AE%9A%E7%90%86)
- フォードファルカーソンアルゴリズム(http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%89%E3%83%BB%E3%83%95%E3%82%A1%E3%83%AB%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)