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