【发布时间】:2017-05-18 01:49:59
【问题描述】:
问题和代码在最后 我希望这个问题属于这里,而不是 TCS 的堆栈。 我正在尝试通过Turk and Pentland's "Eigenfaces for Recognition" 中的算法。
在第 74 页上可以阅读(左栏的最后一段):
让训练(...)集合的平均人脸由[*]定义
其中 [*] 是一个等式,表示平均人脸等于图像总和除以它的计数。为了使用这个等式,我使用 OpenCV 和 numpy 创建了 python 脚本。
在第 75 页上有图 1。它应该代表图 1 中的平均脸。(第 74 页)这就是我想要实现的目标。
作为一个面部集,我使用来自Faces94 的所有面部。 当我计算传统平均值 (1/M*sum) 时,结果如下所示:
这与预期相差甚远,主要是因为那些奇怪的“点”。 但是,当我计算平均值时,比如人脸比实际多(例如 1/(2*M) * sum),结果看起来更准确:
我认为转换 int8int 存在一些问题,但我无法证明这一点。 如果有人发现代码有任何问题,请告诉我,即使它不是解决方案。
问题:我做错了什么/如何获得更好的结果。 代码如下:
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)
【问题讨论】:
-
@Divakar 这是正确答案,请将其作为答案发布,以便我可以接受。此外,我必须将模数从 128 更改为 256 :)
-
好吧,我鼓励您将其与其他相关详细信息一起发布在答案帖子中。找到那些干得好! :)
标签: python algorithm opencv numpy