平均脸 - 算法

13

问题和代码在文章末尾 我希望这个问题适用于此处,而不是TCS的堆栈。 我正在尝试阅读Turk和Pentland的“用于识别的特征脸”中的算法。

在第74页的左栏最后一段可以看到:

让训练(...)集的平均脸定义为[*]

其中[*]是一个方程,表明平均面等于图像总和除以它的数量。为了使用这个方程,我使用OpenCV和numpy创建了一个Python脚本。

第75页有图1,应该代表图1的平均脸。 (pg. 74), 这就是我想要实现的东西。

作为面部集,我使用Faces94 中的所有面孔。 当我计算传统平均值 (1/M*sum) 时,结果看起来像这样:

enter image description here

由于那些奇怪的“斑点”,这与预期相差甚远。然而,当我像有更多脸一样计算平均值时(例如1/(2*M) * sum),结果看起来更加准确:

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)

@Divakar 这是正确的答案,请将其发布为答案,以便我可以接受它。 此外,我不得不将模数从128更改为256 :) - MaLiN2223
1
我鼓励你将那些相关细节与答案一起发布。找到它们真是干得好! :) - Divakar
1个回答

9

感谢@Divakar,我在我的代码中发现了两个问题。

  1. OpenCV中的图像数组是基于uint8而不是int8的。
  2. 我使用模运算(np.mod(img,128)),导致我的图像范围从0到127,而应该是从0到255。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接