Load libraries

library(tidyverse)
library(jpeg)  # For reading JPEG files
library(reshape2)  # For data manipulation
library(pracma)  # For eigenvector calculation
library(OpenImageR)

Read the data

file_paths <- list.files(
  path = "C:/Users/akpla/Documents/data605/Assignment_4/jpg",
  pattern = "*.jpg", full.names = TRUE)

images <- lapply(file_paths, readJPEG)

Flatten images into vectors

image_vectors <- lapply(images, function(x) {
  as.vector(x)
})

Calculate covariance matrix

image_matrix <- matrix(unlist(image_vectors),
                       nrow = length(image_vectors[[1]]))

cor_matrix <- cor(scale(image_matrix, center = TRUE, scale = TRUE))

Compute eigenvectors and eigenvalues

eigen_res <- eigen(cor_matrix)

Select top eigenvectors capturing 80% of the variability

total_variance <- sum(eigen_res$values)
cumulative_variance <- cumsum(eigen_res$values) / total_variance
num_eigenvectors <- which.max(cumulative_variance >= 0.8)
num_eigenvectors
## [1] 3

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNCINCmF1dGhvcjogIktvc3NpIEFrcGxha2EiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCiMjIExvYWQgbGlicmFyaWVzDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoanBlZykgICMgRm9yIHJlYWRpbmcgSlBFRyBmaWxlcw0KbGlicmFyeShyZXNoYXBlMikgICMgRm9yIGRhdGEgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHByYWNtYSkgICMgRm9yIGVpZ2VudmVjdG9yIGNhbGN1bGF0aW9uDQpsaWJyYXJ5KE9wZW5JbWFnZVIpDQpgYGANCg0KIyMgUmVhZCB0aGUgZGF0YQ0KDQpgYGB7cn0NCmZpbGVfcGF0aHMgPC0gbGlzdC5maWxlcygNCiAgcGF0aCA9ICJDOi9Vc2Vycy9ha3BsYS9Eb2N1bWVudHMvZGF0YTYwNS9Bc3NpZ25tZW50XzQvanBnIiwNCiAgcGF0dGVybiA9ICIqLmpwZyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQppbWFnZXMgPC0gbGFwcGx5KGZpbGVfcGF0aHMsIHJlYWRKUEVHKQ0KYGBgDQoNCiMjIyBGbGF0dGVuIGltYWdlcyBpbnRvIHZlY3RvcnMNCg0KYGBge3J9DQppbWFnZV92ZWN0b3JzIDwtIGxhcHBseShpbWFnZXMsIGZ1bmN0aW9uKHgpIHsNCiAgYXMudmVjdG9yKHgpDQp9KQ0KYGBgDQoNCiMjIyBDYWxjdWxhdGUgY292YXJpYW5jZSBtYXRyaXgNCg0KYGBge3J9DQppbWFnZV9tYXRyaXggPC0gbWF0cml4KHVubGlzdChpbWFnZV92ZWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IGxlbmd0aChpbWFnZV92ZWN0b3JzW1sxXV0pKQ0KDQpjb3JfbWF0cml4IDwtIGNvcihzY2FsZShpbWFnZV9tYXRyaXgsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkpDQpgYGANCg0KIyMjIENvbXB1dGUgZWlnZW52ZWN0b3JzIGFuZCBlaWdlbnZhbHVlcw0KDQpgYGB7cn0NCmVpZ2VuX3JlcyA8LSBlaWdlbihjb3JfbWF0cml4KQ0KYGBgDQoNCiMjIyBTZWxlY3QgdG9wIGVpZ2VudmVjdG9ycyBjYXB0dXJpbmcgODAlIG9mIHRoZSB2YXJpYWJpbGl0eQ0KDQpgYGB7cn0NCnRvdGFsX3ZhcmlhbmNlIDwtIHN1bShlaWdlbl9yZXMkdmFsdWVzKQ0KY3VtdWxhdGl2ZV92YXJpYW5jZSA8LSBjdW1zdW0oZWlnZW5fcmVzJHZhbHVlcykgLyB0b3RhbF92YXJpYW5jZQ0KbnVtX2VpZ2VudmVjdG9ycyA8LSB3aGljaC5tYXgoY3VtdWxhdGl2ZV92YXJpYW5jZSA+PSAwLjgpDQpudW1fZWlnZW52ZWN0b3JzDQpgYGANCg0KDQouLi4NCg==