2017-01-03 105 views
11

質疑和代碼是在末尾 我希望這個問題屬於這裏,而不是TCS的堆棧。 我正試圖通過Turk and Pentland's "Eigenfaces for Recognition"中的算法。平均臉 - 算法

在74人能讀(左欄的最後一段)頁:

讓培訓(...)設定的平均面由[*]

定義其中[*]是表示平均面等於圖像總和除以它的計數的等式。爲了使用這個equantion,我使用OpenCV和numpy創建了python腳本。

在第75頁有圖1.它應該代表圖1中的平均面(第74頁),這是我試圖實現的。

作爲一個臉部套裝,我使用了Faces94的所有臉部。 當我計算traditionall平均(1/M *總和)的結果是這樣的:

enter image description here

這是因爲這些奇怪的「點」的大多是遠離預期。 然而,當計算平均像有更多的面比實際(例如,1 /(2 * M)*之和)的結果看起來更精確的:

enter image description here

我認爲有在轉換INT8一些問題< - > int但我無法證明它。 如果任何人都可以發現任何代碼問題,請讓我知道,即使它不是解決方案。

問題:我在做什麼錯誤/怎麼做才能獲得更好的結果。 下面是代碼:

import numpy as np 
import glob 
import cv2 
from cv2 import imread 

dir = "../images/faces94/**/**.jpg" 

files = list(glob.iglob(dir, recursive=True)) 
img = np.zeros(imread(files[0],0).shape) 
img = img.astype('int') 
for i in range(len(files)): 
    img += imread(files[i],0).astype('int') 

img = np.divide(img,len(files)*2) # HERE you can change it to np.divide(img,len(files)) in order to see bad result 
img = np.mod(img,128) 
img = img.astype(np.int8) 

cv2.imshow("image", img) 
cv2.waitKey(0) 
+0

@Divakar這是正確的答案,請張貼它作爲答案,所以我可以接受它。 此外,我不得不將模數從128更改爲256 :) – MaLiN2223

+1

嗯,我會鼓勵你在回答帖子中發佈那些與其他相關細節。找到那些好的工作! :) – Divakar

回答

7

感謝@Divakar我發現我的代碼中的兩個問題。在OpenCV中

  1. 圖像陣列基於UINT8不INT8
  2. 我正在做模(np.mod(IMG,128)),並且因爲它的我的圖像範圍從0到127,應該是從0到255.