¿Convirtiendo un array de imágenes de RGB a HSL/HSV y viceversa?
Leo imágenes jpg en color usando readJPEG ()
del paquete jpeg
. Ahora tengo mis imágenes como arreglos tridimensionales (ancho, alto, canales) en R.
Quiero convertir estos arreglos de imagen al espacio de color HSL o HSV, mutar las imágenes y guardarlas como JPG en el formato RGB nuevamente. Sin embargo, como las imágenes son bastante grandes (5000 x 8000), sería demasiado consumir tiempo iterar por cada celda individualmente. Encontré el paquete OpenImageR
para convertir la imagen al espacio de color HSV rápidamente, sin embargo, estoy confundido por los grandes valores negativos en el canal “saturación”. Además, el paquete no contiene funciones para convertir la imagen nuevamente.
¿Existe algún paquete para realizar conversiones rápidas de RGB a HSL o HSV (y viceversa)? ¿O hay alguna otra manera de realizar la conversión rápidamente?
Estos son mis intentos actuales para convertir en una dirección, elemento por elemento:
# cargar paquetes
library(jpeg)
library(plotwidgets)
# cargar imagen
img <- readJPEG(img_path)
img <- img * 255
# nueva imagen vacía
img_new <- array(NA, dim = dim(img))
# esto tarda demasiado
for (img_row in 1:dim(img)[1]) {
for (img_col in 1:dim(img)[2]) {
img_new[img_row,img_col,] <- round(rgb2hsl(as.matrix(img[img_row,img_col,])))
}
}
# esto también tarda demasiado
for (img_row in 1:dim(img)[1]) {
img_new[img_row,,] <- t(round(rgb2hsl(t(matrix(img[img_row,,], ncol = 3)))))
}
# esto también tarda mucho tiempo
rgb_hsl_fun <- function(x) {
as.numeric(rgb2hsl(matrix(x)))
}
img_hsl <- apply(X = img, MARGIN = c(1,2), FUN = rgb_hsl_fun)
davy.ai
En R existen varios paquetes que pueden hacer conversiones rápidas de RGB a HSL o HSV y viceversa. Algunos de los paquetes comúnmente utilizados incluyen
colorspace
,grDevices
,dplyr
,imager
,magick
yEBImage
. Aquí presentamos un ejemplo de código que utiliza el paquetecolorspace
:En este código, primero cargamos la imagen utilizando
readJPEG()
y luego la convertimos al espacio de color HSV utilizandorgb2hsv()
del paquetecolorspace
. Luego realizamos una mutación sobre el canal de “saturación” al sumarle 0.2. Finalmente, convertimos la imagen de vuelta al espacio de color RGB utilizandohsv2rgb()
y la guardamos como JPEG utilizandowriteJPEG()
. Este enfoque es mucho más rápido que hacer un ciclo a través de cada celda utilizando for-loops.