# Install the package, if required
source("https://bioconductor.org/biocLite.R")
#biocLite("BiocUpgrade")
biocLite()
biocLite("EBImage")

origImage <- EBImage::readImage("joker.jpg","JPG")
dim(origImage)
EBImage::display(origImage)

# Compute the SVD of original image
origImage.svd <- svd(origImage)
recImage <- origImage.svd$u %*% diag(origImage.svd$d) %*% t(origImage.svd$v)
EBImage::display(recImage)

# Compress down to Principal Components
pc10Image <- origImage.svd$u[,1:10] %*% diag(origImage.svd$d[1:10]) %*% t(origImage.svd$v[,1:10])
EBImage::display(pc10Image)
pc20Image <- origImage.svd$u[,1:20] %*% diag(origImage.svd$d[1:20]) %*% t(origImage.svd$v[,1:20])
EBImage::display(pc20Image)
pc100Image <- origImage.svd$u[,1:100] %*% diag(origImage.svd$d[1:100]) %*% t(origImage.svd$v[,1:100])
EBImage::display(pc100Image)

for (i in seq(10, 120, 10)) { 
  pciImage <- origImage.svd$u[,1:i] %*% diag(origImage.svd$d[1:i]) %*% t(origImage.svd$v[,1:i])
  EBImage::display(pciImage)
}

plot(origImage.svd$d, type = 'h')
plot(origImage.svd$d[1:120], type = 'h')
k = 60
t(origImage.svd$d) %*% origImage.svd$d
t(origImage.svd$d[1:k]) %*% origImage.svd$d[1:k]
t(origImage.svd$d[1:k]) %*% origImage.svd$d[1:k] / t(origImage.svd$d) %*% origImage.svd$d

pckImage <- origImage.svd$u[,1:k] %*% diag(origImage.svd$d[1:k]) %*% t(origImage.svd$v[,1:k])
EBImage::display(pckImage)
