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]
#Comprobar la imagen
writeJPEG(color1, paste('imagen-blanco-negro.jpg', sep = ''))
# Realizar el análisis de componentes principales
pca <- prcomp(color1, center = FALSE)# 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 = ''))
# 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 = ''))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
}
# 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%»
















Como podría realizar la compresión para imágenes PNG?
Buenas Jeifer, prueba con readPNG, te dejo un enlace a la documentación oficial. https://www.rdocumentation.org/packages/png/versions/0.1-7/topics/readPNG