Среднее лицо - алгоритм

Quesion и код в конце Надеюсь, что этот вопрос будет рассмотрен здесь, а не стек TCS. Я пытаюсь выполнить алгоритмы в Turk и Pentland "Собственные функции для распознавания" .

На стр. 74 можно прочитать (последний абзац левой колонки):

Пусть обучение (...) Средняя грань множества определяется [*]

Где [*] - это уравнение, говорящее, что среднее лицо равно сумме изображений, деленных на него. Для использования этого equantion я создал python script с помощью OpenCV и numpy.

На стр. 75 показана диаграмма 1., которая должна представлять собой среднюю грань на рисунке 1. (стр. 74), и этого я пытаюсь достичь.

Как набор лиц, я использую все грани из Faces94. Когда я вычисляю традиционное среднее значение (1/M * sum), результат выглядит следующим образом:

введите описание изображения здесь

который находится далеко от ожидаемого, в основном из-за этих странных "пятен". Однако, когда я вычисляю среднее значение, как было больше лиц, чем на самом деле (например, 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)

Ответ 1

Благодаря @Divakar я обнаружил две проблемы в своем коде.

  • Массивы изображений в opencv основаны на uint8 не int8
  • Я делал modulo (np.mod(img, 128)), и из-за этого мое изображение варьировалось от 0 до 127 и должно быть от 0 до 255.