平均面部算法

MaL*_*223 13 python algorithm opencv numpy

问题和代码最后 我希望这个问题属于这里而不是TCS的堆栈.我试图通过Turk和Pentland的"Eigenfaces for Recognition"中的算法.

在页74上可以阅读(左栏的最后一段):

让训练(...)集合的平均面由[*]定义

其中[*]是一个等式,表示平均面等于图像之和除以它的计数.为了使用这个equantion我使用OpenCV和numpy创建了python脚本.

在第75页上有图1.它应代表图1中的平均面部.(第74页)这就是我想要实现的目标.

作为一个面部集我使用Faces94的所有面孔.当我计算传统平均值(1/M*总和)时,结果如下所示:

在此输入图像描述

这远远超出预期,主要是因为那些奇怪的"斑点".但是,当我计算平均值时,实际上有更多的面孔(例如1 /(2*M)*总和),结果看起来更准确:

在此输入图像描述

我认为在转换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)
Run Code Online (Sandbox Code Playgroud)

MaL*_*223 9

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

  1. opencv中的图像数组基于uint8而不是int8
  2. 我正在做模数(np.mod(img,128)),因此我的图像范围从0到127,应该是0到255.