问题和代码在文章末尾 我希望这个问题适用于此处,而不是TCS的堆栈。 我正在尝试阅读Turk和Pentland的“用于识别的特征脸”中的算法。
在第74页的左栏最后一段可以看到:
让训练(...)集的平均脸定义为[*]
其中[*]是一个方程,表明平均面等于图像总和除以它的数量。为了使用这个方程,我使用OpenCV和numpy创建了一个Python脚本。
第75页有图1,应该代表图1的平均脸。 (pg. 74), 这就是我想要实现的东西。
作为面部集,我使用Faces94 中的所有面孔。 当我计算传统平均值 (1/M*sum) 时,结果看起来像这样:
由于那些奇怪的“斑点”,这与预期相差甚远。然而,当我像有更多脸一样计算平均值时(例如1/(2*M) * sum),结果看起来更加准确:
我认为在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)