Как воспроизвести изображение, используя writeJPEG из среднего значения всех элементов вложенного массива в R - PullRequest
1 голос
/ 24 марта 2019

У меня есть вложенный массив со сложной структурой. Этот массив представляет собой коллекцию из 15 человек, на каждом из которых 11 изображений, на которых изображены 11 выражений лица, таких как подмигивание, счастье и т. Д.

Я хотел бы рассчитать средние снимки 15 человек с их 11 снятыми снимками.

enter image description here

Структура all.faces:

> str(all.faces)
List of 165
 $ : int [1:159, 1:159] 48 50 51 50 50 53 57 55 50 47 ...
 $ : int [1:159, 1:159] 159 156 131 130 117 115 122 119 123 129 ...
 (... and 163 more...)
  [list output truncated]
 - attr(*, "dim")= int [1:2] 11 15
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:11] "centerlight" "glasses" "happy" "leftlight" ...
  ..$ : NULL

Когда я пытался

myarray <- array(as.numeric(unlist(faces)), dim=c(159, 159, 15))

mean.faces <- apply(myarray,1:2, mean)
writeJPEG(mean.faces,"MEAN_FACES.jpg")

Я получил это:

enter image description here

Как получилось? Я бы предположил, что я бы использовал какое-то изображение, а не беспорядок черно-белой цветовой схемы, подобной этой.

Воспроизводимый пример

faces <- readMat("https://github.com/angelleng/545dump/blob/master/yalefaces.mat?raw=true")
faces.array <- array(as.numeric(unlist(faces)), dim=c(159, 159, 15))

mean.all.faces <- apply(faces.array,1:2, mean)
writeJPEG(mean.all.faces,"MEAN_FACES.jpg")

Как лучше всего подойти к этой ситуации?

Заранее спасибо.

1 Ответ

1 голос
/ 25 марта 2019

Краткий ответ: writeJPEG() нужна матрица значений от 0 до 1. Вы передаете ей необработанные данные, значения которых находятся в диапазоне 0-255.

Подробно, пример, который вы привели(yalefaces.mat) имеет размеры:

> faces <- readMat("https://github.com/angelleng/545dump/blob/master/yalefaces.mat?raw=true")
> dim(faces[[1]])
[1]   48   42 2414

, поэтому на самом деле это 2414 граней размером 48х42.Мы можем отобразить один из них так:

> image(faces[[1]][,,1])

a face

Если вы усредните их (конечно, не пытаясь изменить размер массива):

> mean.all.faces <- apply(faces[[1]], 1:2, mean)
> image(mean.all.faces)

кажется, что он работает нормально:

enter image description here

Но когда вы записываете это в JPEG, следующее даст мусор:

> writeJPEG(mean.all.faces, "BAD.jpg")

enter image description here

, хотя работает следующее (хотя немного темновато):

> writeJPEG(mean.all.faces/255, "GOOD.jpg")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...