PCA Análisis de componentes principales para compresión de imágenes

PCA Análisis de componentes principales para compresión de imágenes monocromo

# Modificar el directorio raiz utilizado
setwd("/Ruta de trabajo")

# Separar la imagen en su tres componentes RGB aplicando sobre cada uno el PCA y quedandonos con un solo color
imagen <- readJPEG('imagen-original.jpg')
color1 <- imagen[,,1]
imagen-original
#Comprobar la imagen
writeJPEG(color1, paste('imagen-blanco-negro.jpg', sep = ''))

# Realizar el análisis de componentes principales
pca <- prcomp(color1, center = FALSE)
imagen-blanco-negro
# Mostrar la imagen para 15 componentes
n = 15
resultado <- pca$x[,1:n] %*% t(pca$rotation[,1:n])
writeJPEG(resultado, paste('imagen_comprimida_15_componentes.jpg', sep = ''))
imagen_comprimida_15_componentes
# Mostrar la imagen para 300 componentes
n = 300
resultado <- pca$x[,1:n] %*% t(pca$rotation[,1:n])
writeJPEG(resultado, paste('imagen_comprimida_300_componentes.jpg', sep = ''))
imagen_comprimida_300_componentes

PCA Análisis de componentes principales para compresión de imágenes RGB

# PCA para imagenes
install.packages("jpeg", dependencies = TRUE)
library("jpeg")

# Modificar el directorio raiz utilizado
setwd("/Ruta de trabajo")

imagen <- readJPEG('imagen-original.jpg')

# Separar la imagen en su tres componentes RGB aplicando sobre cada uno el PCA
imagen.r.pca <- prcomp(imagen[,,1], center = FALSE)
imagen.g.pca <- prcomp(imagen[,,2], center = FALSE)
imagen.b.pca <- prcomp(imagen[,,3], center = FALSE)

# Juntar en una sola variable los tres colores RGB
rgb.pca <- list(imagen.r.pca, imagen.g.pca, imagen.b.pca)

# Generar imagenes con diferentes niveles de componentes principales seleccionados  
componentes.selec <- c(10,15,30,100,200,270,280,300)
componentes.selec.char <- c("010","015","030","100","200","270","280","300")
indice <- 1
for (i in componentes.selec) {
  pca.img <- sapply(rgb.pca, function(j) {
    compressed.img <- j$x[,1:i] %*% t(j$rotation[,1:i])
  }, simplify = 'array')
  writeJPEG(pca.img, paste('imagenes/comprimida_con_', componentes.selec.char[indice], '_componentes.jpg', sep = ''))
  indice <- indice +1
}

 

 

 

 

comprimida_con_010_componentes

comprimida_con_015_componentes

 

comprimida_con_030_componentes

 

comprimida_con_100_componentes

 

comprimida_con_200_componentes

 

comprimida_con_270_componentes

 

comprimida_con_280_componentes

comprimida_con_300_componentes

# Mostrar cuanto pomprime las imagenes para diferente numero de componentes principales elegidos
original <- file.info('imagen-original.jpg')$size / 1000
imgs <- dir('imagenes/')
for (i in imgs) {
  full.path <- paste('imagenes/', i, sep='')
  print(paste(i, '  Comprimida: ', file.info(full.path)$size / 1000, '  Original: ', original, '    Diferencia: ', round((file.info(full.path)$size / 1000 - original) / original, 2) * 100, '%', sep = ''))
}

«comprimida_con_010_componentes.jpg  Comprimida: 40.492  Original: 100.823    Diferencia: -60%»
«comprimida_con_015_componentes.jpg  Comprimida: 45.209  Original: 100.823    Diferencia: -55%»
«comprimida_con_030_componentes.jpg  Comprimida: 53.967  Original: 100.823    Diferencia: -46%»
«comprimida_con_100_componentes.jpg  Comprimida: 69.191  Original: 100.823    Diferencia: -31%»
«comprimida_con_200_componentes.jpg  Comprimida: 75.632  Original: 100.823    Diferencia: -25%»
«comprimida_con_270_componentes.jpg  Comprimida: 77.826  Original: 100.823    Diferencia: -23%»
«comprimida_con_280_componentes.jpg  Comprimida: 78.26    Original: 100.823    Diferencia: -22%»
«comprimida_con_300_componentes.jpg  Comprimida: 78.834  Original: 100.823    Diferencia: -22%»