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?
davy.ai
Para aplicar las funciones DNstd y DNnor al raster RGB completo en un solo paso, puedes usar la función
calc()
del paqueteraster
. 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:
En esta implementación, la función
calc()
aplica las funcionesDNstd()
yDNnor()
a cada píxel en el stack del raster RGB. El resultado es un raster normalizador_norm
que luego se puede graficar usando la funciónplotRGB()
del paqueterasterVis
.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ónDNnor()
debe aplicarse por separado a cada capa. Por lo tanto, es más eficiente calcular la funciónDNstd()
solo una vez y luego aplicar la funciónDNnor()
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.