Este cuaderno pretende mostrar una clasificación no supervisada con el algoritmo K-means.

En la clasificación supervisada no se emplean datos de entrenamiento, el software automáticamente agrupa lo pixeles en las clases que el usuario determine.

La imagen satelital usada se denomina “Landsat 8 “ LC08_L1TP_022031_20200831_20200906_01_T1.TIF”, pertenece a la zona sur del lago Michigan, cubre parcialmente los estados de Illinois, Indiana y Michigan.

Se carga la ruta de trrabajo

setwd('C:\\Users\\Antonio\\Desktop\\PERCEPCION_REMOTA\\TALLER\\LABORATORIO 4')
getwd()
## [1] "C:/Users/Antonio/Desktop/PERCEPCION_REMOTA/TALLER/LABORATORIO 4"

Mediante la función paste0 se crean los nombres de las bandas de la 2 a la 7 que se encuentran en la ruta y se guarda en landsatkm. Se les asigna el nombre a cada banda de la imagen landsat 8

rfiles<- paste0('LC08_L1TP_022031_20200831_20200906_01_T1_B',2:7,".TIF")
landsatkm <- rast(rfiles)
names(landsatkm ) <- c('blue', 'green', 'red', 'NIR', 'SWIR1', 'SWIR2')

Se grafica la imagen con las bandas 3,2,1 (red,green, blue)

plotRGB(landsatkm, 3, 2, 1, main="Color verdadero",stretch = "lin")

Se calcula los valores de TOA para la clasificación no supervisada. Los valores que se emplean se encuentran en los metadatos adjuntos en la imagen satelital (archivo txt). En la tabla se muestran los valores máximos y mínimos por cada banda.

toaKM <-  -0.1 + landsatkm*2.0E-5
toaKM
## class       : SpatRaster 
## dimensions  : 7871, 7751, 6  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 403485, 636015, 4504485, 4740615  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=utm +zone=16 +datum=WGS84 +units=m +no_defs 
## source      : spat_yXbQSV6Qb94U6Gt.tif 
## names       :    blue,   green,     red,     NIR,   SWIR1,   SWIR2 
## min values  :    -0.1,    -0.1,    -0.1,    -0.1,    -0.1,    -0.1 
## max values  : 0.92802, 1.03274, 1.07986, 1.21070, 1.21070, 1.21070

kmeans classification

Para emplear el clasificador primero se realiza un corte de la imagen en un área de estudio, en este caso se conoce previamente los valores que se van a emplear en el corte y se guardan en la variable e (x maximo, x minimo, y maximo, y minimo).

e <- ext(412516.7, 475438.1, 4547963, 4648559)
# crop landsat by the extent
TOAK <- crop(toaKM, e)
TOAK
## class       : SpatRaster 
## dimensions  : 3353, 2097, 6  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 412515, 475425, 4547955, 4648545  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=utm +zone=16 +datum=WGS84 +units=m +no_defs 
## source      : memory 
## names       :    blue,   green,     red,     NIR,   SWIR1,   SWIR2 
## min values  :    -0.1,    -0.1,    -0.1,    -0.1,    -0.1,    -0.1 
## max values  : 0.52154, 0.52796, 0.58882, 1.21070, 1.21070, 1.21070

nr Convierte el raster de vector a matrix str() muestra todos los detalles de los objetos en memoria, incluyendo las columnas de los marcos de datos (“data frames”), matrices y listas, lo cual pue- de generar una gran cantidad de información.

nr <- values(TOAK)
str(nr)
##  num [1:7031241, 1:6] -0.1 -0.1 -0.1 -0.1 -0.1 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:6] "blue" "green" "red" "NIR" ...

El generador de semillas se configura para que “kmeans” inicie sus centros de ubicaciones aleatoriamente. en este caso sea 99.

set.seed(99)

Par la fórmula de K medias Se crean 5 clusters, se permiten 500 iteraciones y que comience con 5 conjuntos aleatorios usando el método “Lloyd”

kmncluster <- kmeans(na.omit(nr), centers = 5, iter.max = 500, nstart = 5, algorithm="Lloyd")

Se muestran los detalles del metodo

str(kmncluster)
## List of 9
##  $ cluster     : int [1:7031241] 1 1 1 1 1 1 1 1 1 1 ...
##  $ centers     : num [1:5, 1:6] -0.1 0.0791 0.0827 0.0928 0.1338 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:5] "1" "2" "3" "4" ...
##   .. ..$ : chr [1:6] "blue" "green" "red" "NIR" ...
##  $ totss       : num 274415
##  $ withinss    : num [1:5] 32.9 6157.7 813.1 9500.6 9737
##  $ tot.withinss: num 26241
##  $ betweenss   : num 248173
##  $ size        : int [1:5] 527989 2011501 1081441 2615371 794939
##  $ iter        : int 79
##  $ ifault      : NULL
##  - attr(*, "class")= chr "kmeans"

Se usan los valores de TOAK para establecer los valores del clúster en un nuevo ráster

knr <- TOAK
values(knr) <- kmncluster$cluster
knr
## class       : SpatRaster 
## dimensions  : 3353, 2097, 6  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 412515, 475425, 4547955, 4648545  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=utm +zone=16 +datum=WGS84 +units=m +no_defs 
## source      : memory 
## names       : blue, green, red, NIR, SWIR1, SWIR2 
## min values  :    1,     1,   1,   1,     1,     1 
## max values  :    5,     5,   5,   5,     5,     5

Se grafica imagen TOAk y los clusters creados mediante el método “Lloyd”, se colocan uno a cada lado para para poder compararlos

mycolor <- c("darkgreen","blue", "darkgoldenrod4","darkorange1","coral3")
#class <- c("Pastos","Agua","Urbano","Pastos","Urbano")
par(mfrow = c(1,2))
plot(TOAK, col = rev(terrain.colors(10)), main = "Landsat-NDVI")

plot(knr, main = 'Unsupervised classification', col = mycolor, type="classes")

Reproductibilidad

Este documento se basa en el cuaderno del profesor Ivan Alberto Lizarazo que puede ser consultado en el siguiente link: https://rspatial.org/terra/rs/4-unsupclassification.html

sessionInfo()
## R version 4.0.5 (2021-03-31)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18363)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Spanish_Spain.1252  LC_CTYPE=Spanish_Spain.1252   
## [3] LC_MONETARY=Spanish_Spain.1252 LC_NUMERIC=C                  
## [5] LC_TIME=Spanish_Spain.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] corrplot_0.84 rgeos_0.5-5   terra_1.0-10  ggplot2_3.3.3 rgdal_1.5-23 
## [6] raster_3.4-5  sp_1.4-5     
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.6        highr_0.8         bslib_0.2.4       compiler_4.0.5   
##  [5] pillar_1.5.1      jquerylib_0.1.3   tools_4.0.5       digest_0.6.27    
##  [9] jsonlite_1.7.2    evaluate_0.14     lifecycle_1.0.0   tibble_3.1.0     
## [13] gtable_0.3.0      lattice_0.20-41   pkgconfig_2.0.3   rlang_0.4.10     
## [17] DBI_1.1.1         yaml_2.2.1        xfun_0.21         withr_2.4.1      
## [21] dplyr_1.0.5       stringr_1.4.0     knitr_1.31        generics_0.1.0   
## [25] vctrs_0.3.6       sass_0.3.1        tidyselect_1.1.0  grid_4.0.5       
## [29] glue_1.4.2        R6_2.5.0          fansi_0.4.2       rmarkdown_2.7    
## [33] purrr_0.3.4       magrittr_2.0.1    scales_1.1.1      codetools_0.2-18 
## [37] htmltools_0.5.1.1 ellipsis_0.3.1    assertthat_0.2.1  colorspace_2.0-0 
## [41] utf8_1.1.4        stringi_1.5.3     munsell_0.5.0     crayon_1.4.1