es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
Tags:  , , ,

Answer

  1. Avatar for 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 y EBImage. Aquí presentamos un ejemplo de código que utiliza el paquete colorspace:

    library(jpeg)
    library(colorspace)
    
    # cargar imagen
    img <- readJPEG(img_path)
    
    # convertir a HSV
    img_hsv <- rgb2hsv(img)
    
    # realizar mutación sobre el canal "saturación"
    img_hsv[,,2] <- img_hsv[,,2] + 0.2
    
    # convertir de vuelta a RGB
    img_new <- hsv2rgb(img_hsv)
    
    # guardar la imagen mutada como JPEG
    writeJPEG(img_new, "mutated_image.jpg")
    

    En este código, primero cargamos la imagen utilizando readJPEG() y luego la convertimos al espacio de color HSV utilizando rgb2hsv() del paquete colorspace. 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 utilizando hsv2rgb() y la guardamos como JPEG utilizando writeJPEG(). Este enfoque es mucho más rápido que hacer un ciclo a través de cada celda utilizando for-loops.

Comments are closed.