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.

Valores normalizados en un raster RGB utilizando una función.

Me gustaría aplicar una función a un raster RGB, primero normalizando los valores originales usando la fórmula “DNstd = (DN – media(DN)) / desviación estándar(DN)”, y luego el proceso de normalización usando la fórmula “DNnor = 255 * (DNstd – mínimo(DNstd)) / (máximo(DNstd) – mínimo(DNstd))” sin éxito. No quería aplicarlo por capa, sino a todo el raster (“r”) en una sola función. En mi ejemplo:

# Crear un raster RGB
library(raster)
r1 <- raster(ncol=10, nrow=10)
values(r1) <- rpois(100, 150)
r2 <- raster(ncol=10, nrow=10)
values(r2) <- rpois(100, 200)
r3 <- raster(ncol=10, nrow=10)
values(r3) <- rpois(100, 150)
r <- stack(r1, r2, r3)
names(r) <- c("R", "G", "B")
r
# clase      : RasterStack 
# dimensiones : 10, 10, 100, 3  (nrow, ncol, ncell, nlayers)
# resolución : 36, 18  (x, y)
# extensión     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
# crs        : +proj=longlat +datum=WGS84 +no_defs 
# nombres      :   R,   G,   B 
# valores mínimos : 124, 170, 126 
# valores máximos : 183, 235, 181 

# Normalizar los valores usando DNstd = (DN - DNmean) / DNstd 
# y luego normalizar los valores usando DNnor = 255 * (DNstd - DNstdmin) / (DNstdmax - DNstdmin)
DNnor <- function(img, i, j, k) {
  bi <- img[[i]]
  bj <- img[[j]]
  bk <- img[[k]]
  bi_std <- (bi - mean(bi)) / sd(bi)
  bj_std <- (bj - mean(bj)) / sd(bj)
  bk_std <- (bk - mean(bk)) / sd(bk)
  bi_nor <- 255 * (bi_std - min(bi_std)) / (max(bi_std) - min(bi_std))
  bj_nor <- 255 * (bj_std - min(bj_std)) / (max(bj_std) - min(bj_std))
  bk_nor <- 255 * (bk_std - min(bk_std)) / (max(bk_std) - min(bk_std))
  return(bi_nor, bj_nor, bk_nor)
}
imagen_normalizada <- DNnor(r, 1, 2, 3)
# Error in as.double(x) : 
# no se puede coercer el tipo 'S4' a un vector de tipo 'double'

Por favor, ¿alguna ayuda con esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para aplicar las funciones DNstd y DNnor al raster RGB completo en un solo paso, puedes usar la función calc() del paquete raster. Esta función aplica una función definida por el usuario a cada píxel en el stack del raster, permitiéndote manipular todas las capas a la vez.

    Aquí tienes un ejemplo de implementación para tu escenario:

    # Definir las funciones DNstd y DNnor
    DNstd <- function(x) {
      (x - mean(x)) / sd(x)
    }
    
    DNnor <- function(x) {
      255 * (x - min(x)) / (max(x) - min(x))
    }
    
    # Aplicar las funciones al raster RGB completo
    r_norm <- calc(r, fun = function(x) {
      DNnor(DNstd(x))
    })
    
    # Graficar el raster RGB normalizado resultante
    plotRGB(r_norm, scale = 255)
    

    En esta implementación, la función calc() aplica las funciones DNstd() y DNnor() a cada píxel en el stack del raster RGB. El resultado es un raster normalizado r_norm que luego se puede graficar usando la función plotRGB() del paquete rasterVis.

    Ten en cuenta que la función DNstd() es vectorizada, por lo que puede manejar todas las capas del stack a la vez, pero la función DNnor() debe aplicarse por separado a cada capa. Por lo tanto, es más eficiente calcular la función DNstd() solo una vez y luego aplicar la función DNnor() a cada capa por separado.

    Además, ten en cuenta que la función plotRGB() espera que los valores de los píxeles estén en el rango de 0 a 255, por lo que debemos escalar los valores en consecuencia.

Comments are closed.