💡 OBJETIVOS DE LA ACTIVIDAD:

► Conocer y practicar los procedimientos necesarios para realizar el recorte de imágenes de satélite.

💡 MATERIALES PARA LA ACTIVIDAD:

Los materiales para el desarrollo de esta actividad son los mismos de la actividad pasada.

Actividad con ficheros monobanda. Contiene los siguientres ficheros:

Imagen Landsat. Ficheros en formato ráster correspondientes a una escena de Landsat tomada

script_laboratorio_3_recorte_imágenes

INTRODUCCIÓN

Como hemos señalado en el apartado anterior, trabajar con las imágenes originales es complicado y costoso en términos de tiempo y uso de recursos computacionales. Los procedimientos que se explicarán en este apartado, conocidos de manera popular como “recortes”, son útiles para excluir aquellas áreas o aquellas bandas que no interesan para su análisis posterior. Con ello, se aligera su “peso”, lo que redunda en una mayor velocidad de procesamiento.

De acuerdo con lo expuesto en el párrafo anterior, el recorte se puede efectuar de dos maneras:

Recorte espectral: cuyo objetivo es trabajar con un número reducido de bandas espectrales, extraídas de una imagen raster multibanda. Este procedimiento será planteado de manera marginal.

Recorte espacial: es el más habitual, y tiene por objeto reducir el área original de la imagen raster a un zona de tamaño más reducido. Es el que se trabajará en este apartado.

RECORTE ESPACIAL

Muchos análisis territoriales implican la integración de datos procedentes de fuentes diferentes, como las imágenes de satélite (en formato ráster), bases de datos sobre usos de suelo (en formato ráster o vectorial) y límites administrativos (habitualmente en formato vectorial). A menudo, la extensión de los datos ráster de entrada es mayor que el área de interés (ROI, “region of interest” en inglés), por lo que conviene eliminar aquellas zonas ajena al área de interés.

Aunque aparentemente es una acción inocua, conviene tener en cuenta ciertos aspectos que pueden generar problemas. Por ejemplo, en una determinada composición RGB (por ejemplo a color natural o falso color), el recorte afectará a todas las bandas que componen la imagen multibanda; esto influye en la profundidad de píxel de la nueva escena resultante. Si se emplean formatos de archivos (JPG, TIF, PNG, JP2, ECW…) con profundidad de píxel diferente a la del archivo original los valores originales del píxel también variarán, produciendo imágenes con contrastes cromáticos diferentes a los originales.

La resolución espacial de la imagen será otro de los factores a tener en cuenta y determinará un mayor o menor suavizado en los bordes de la imagen en función de la escala. Con imágenes de alta resolución espacial los límites de la imagen recortada serán más límpios que los de imágenes con píxeles de gran tamaño, porque un píxel no puede cortarse por la mitad.

Además del fichero ráster que va a ser recortado, es necesario disponer de otro fichero con los límites de la región de interés (ROI). Este último puede estar en formato ráster o en formato vectorial , siendo éste último más habitual. En el apartado anterior, denominado delimitacion_ROI, se ofrecen diferentes procedimientos para obtener ese fichero con los límites de la región de interés

Por último, cabe señalar que el recorte (“cropping”) suele venir acompañado del enmascaramiento (“masking”) con el fin de (a) limitar la extensión del área de interés y (b) sustituir todos los valores fuera del área por NA. Terra utiliza dos funciones para realizar ambos procedimientos:

► La función terra::crop()[https://rspatial.github.io/terra/reference/crop.html] recorta el objeto ráster, reduciendo la extensión rectangular del objeto que ocupa el primer argumento (objeto ráster) basándose en la extensión del objeto pasado como segundo argumento (normalmente un objeto vectorial).

raster_recortado <- crop(raster_original, objeto_vectorial)

► La función terra::mask()[https://rspatial.github.io/terra/reference/mask.html] mantiene las dimensiones originales del raster, pero los valores situados fuera de los límites del objeto vectorial son convertidos en NA.

raster_enmascarado <- mask(raster_original, objeto_vectorial)

Si se establece el argumento inverse = TRUE se enmascara todo lo que esté dentro de los límites del objeto vectorial, mientras que si se establece el argumento updatevalue = 0 todos los píxeles que estén fuera de esos límites toman el valor 0.

CARGA DE LOS PAQUETES NECESARIOS PARA LA ACTIVIDAD Y DEFINICIÓN DE LA ESTRUCTURA DE CARPETAS

Como en casos anteriores, se trabajará con el paquete terra. siguientes:

library(terra)
## Warning: package 'terra' was built under R version 4.3.3
## terra 1.8.21

En esta actividad es conveniente crear una carpeta denominada lab_3 que incluya una subcarpeta denominada datos/recorte/ y ésta, a su vez, dos carpetas adicionales:

A continuación, debe establecerse la carpeta dónde se encuentran los ficheros que serán utilizados en esta sesión.

Una vez creado dicha carpeta, se descargarán los ficheros necesarios para esta actividad directamente desde el servidor web.

Y se descomprimirán

Un procedimiento alternativo es realizar todo el proceso manualmente. Para ello, los ficheros necesarios para esta práctica se descargan aquí

RECORTE ESPACIAL DE UN OBJETO RÁSTER MONOBANDA.

Para recortar, además del fichero ráster que va a ser modificado, es necesario disponer de otro fichero con los límites de la región de interés.

En primer lugar se importará un objeto ráster.

mdt <- rast("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/reproyeccion_imagenes/mdt.tif")
crs(mdt, parse = TRUE)
##  [1] "GEOGCRS[\"WGS 84\","                                      
##  [2] "    ENSEMBLE[\"World Geodetic System 1984 ensemble\","    
##  [3] "        MEMBER[\"World Geodetic System 1984 (Transit)\"],"
##  [4] "        MEMBER[\"World Geodetic System 1984 (G730)\"],"   
##  [5] "        MEMBER[\"World Geodetic System 1984 (G873)\"],"   
##  [6] "        MEMBER[\"World Geodetic System 1984 (G1150)\"],"  
##  [7] "        MEMBER[\"World Geodetic System 1984 (G1674)\"],"  
##  [8] "        MEMBER[\"World Geodetic System 1984 (G1762)\"],"  
##  [9] "        MEMBER[\"World Geodetic System 1984 (G2139)\"],"  
## [10] "        ELLIPSOID[\"WGS 84\",6378137,298.257223563,"      
## [11] "            LENGTHUNIT[\"metre\",1]],"                    
## [12] "        ENSEMBLEACCURACY[2.0]],"                          
## [13] "    PRIMEM[\"Greenwich\",0,"                              
## [14] "        ANGLEUNIT[\"degree\",0.0174532925199433]],"       
## [15] "    CS[ellipsoidal,2],"                                   
## [16] "        AXIS[\"geodetic latitude (Lat)\",north,"          
## [17] "            ORDER[1],"                                    
## [18] "            ANGLEUNIT[\"degree\",0.0174532925199433]],"   
## [19] "        AXIS[\"geodetic longitude (Lon)\",east,"          
## [20] "            ORDER[2],"                                    
## [21] "            ANGLEUNIT[\"degree\",0.0174532925199433]],"   
## [22] "    USAGE["                                               
## [23] "        SCOPE[\"Horizontal component of 3D system.\"],"   
## [24] "        AREA[\"World.\"],"                                
## [25] "        BBOX[-90,-180,90,180]],"                          
## [26] "    ID[\"EPSG\",4326]]"

A continuación se importará un fichero con los bordes administrativos de la Comunidad de Madrid, en este caso bajo coordenadas proyectadas (UTM zona 30N). El fichero vectorial con formato .shp se transforma en un objeto SpatVector con la función terra::vect.

cam <- vect("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/recorte_imagenes/comunidad.shp")
cam
##  class       : SpatVector 
##  geometry    : polygons 
##  dimensions  : 1, 1  (geometries, attributes)
##  extent      : -4.579076, -3.052983, 39.88472, 41.16584  (xmin, xmax, ymin, ymax)
##  source      : comunidad.shp
##  coord. ref. : lon/lat WGS 84 (EPSG:4326) 
##  names       :           shapeName
##  type        :               <chr>
##  values      : Comunidad de Madrid

A partir del análisis de los metadatos, se deduce que ambos objetos comparten el mismo Sistema de Referencia de Coordinadas (CRS). Esto permite su representación gráfica.

plot(mdt, 
     axis = TRUE)
## Warning in plot.window(...): "axis" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "axis" is not a graphical parameter
## Warning in title(...): "axis" is not a graphical parameter
plot(cam, add = TRUE)

Dado que visualmente se constata la correspondencia entre ambos objetos espaciales, se utilizará el objeto vectorial cam como ROI para recortar y enmascarar el objeto ráster mdt.

mdt_recortado <- crop(mdt, 
                      cam)
mdt_definitivo <- mask(mdt_recortado,
                       cam)
plot(mdt_definitivo)

RECORTE ESPACIAL DE FICHEROS MULTIBANDA (imágenes de satélite)

A diferencia del caso anterior, en los que se ha trabajado con un fichero ráster unibanda, las escenas de Landsat contienen un conjunto de bandas que deben ser recortadas de la misma manera para su posterior análisis.

Este puede hacerse repitiendo, de manera consecutiva y para cada una de las imágenes, siguiendo el mismo procedimiento ejecutado con el fichero unibanda. Sin embargo, esto puede considerarse una pérdida de tiempo, ya que es posible recortar de manera simultánea todas las bandas.

A continuación se muestra un procedimiento para convertir los ficheros individuales de cada banda en un objeto multibanda en dos pasos:

► PASO 1: creación de una lista con los ficheros que corresponden a cada una de las bandas. Esta sintaxis ya se conoce del tema anterior.

lista <- list.files("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/recorte_imagenes/landsat/",        # Directorio de los datos
                   pattern = ".*B[1234567]\\.tif$",                            # El signo del dólar lista todos los ficheros que acaban igual
                   ignore.case=TRUE,                                           # Sensible a mayúsculas y minúsculas
                   full.names = TRUE)

► PASO 2: se importan los ficheros raster de esa lista y se consultan las características de este objeto ráster.

imagen <- rast(lista)
imagen
## class       : SpatRaster 
## dimensions  : 7911, 7791, 7  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 314085, 547815, 4345785, 4583115  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## sources     : LC08_L1TP_201032_20240917_20240921_02_T1_B1.TIF  
##               LC08_L1TP_201032_20240917_20240921_02_T1_B2.TIF  
##               LC08_L1TP_201032_20240917_20240921_02_T1_B3.TIF  
##               ... and 4 more sources
## names       : LC08_~T1_B1, LC08_~T1_B2, LC08_~T1_B3, LC08_~T1_B4, LC08_~T1_B5, LC08_~T1_B6, ...

Como ya se ha señalado, el manejo de ficheros con bandas cuya denominación es tan complicada dificulta cualquier análisis posterior. Por ello,es conveniente renombrar las bandas para mejorar su identificación. En este caso, se eliminará el texto LC08_L1TP_201032_20210723_20210729_02_T1_ de cada banda, dejando sólo la letra B (de banda) y el número de cada banda.

names(imagen) <- gsub(pattern = "LC08_L1TP_201032_20240917_20240921_02_T1_",    # conjunto de caracteres que se desea sustituir
                           replace ="",                                         # caracteres que sustituirán a los anteriores
                           x <- names(imagen))                                  # vector o dataframe que sustituirán a los anteriores
imagen
## class       : SpatRaster 
## dimensions  : 7911, 7791, 7  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 314085, 547815, 4345785, 4583115  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## sources     : LC08_L1TP_201032_20240917_20240921_02_T1_B1.TIF  
##               LC08_L1TP_201032_20240917_20240921_02_T1_B2.TIF  
##               LC08_L1TP_201032_20240917_20240921_02_T1_B3.TIF  
##               ... and 4 more sources
## names       : B1, B2, B3, B4, B5, B6, ...

Por último, con el fin de verificar que todo el proceso se ha realizado satisfactoriamente, la imagen se representa gráficamente con la función terra::plot()[https://rspatial.github.io/terra/reference/plot.html] a la que se ha añadido el argumento gray.colors(256) para definir una escala de grises con 256 niveles.

plot(imagen[["B6"]], col = gray.colors(256))

El objeto imagen, obtenido a partir de una escena de Lansat, posee un gran tamaño (sus dimensiones son 61634601 píxeles). Para el recorte de esa imagen se utilizarán las diferentes posibilidades definidas en el apartado anterior.

Recorte utilizando un objeto extent.

Si se trabaja simultáneamente con dos objetos espaciales

El procedimiento para recortar una imagen utilizando la función terra::ext, que sirve para para trasladar los límites de uno de los objetos (normalmente el más pequeño) al otro implica los siguientes pasos:

► PASO 1: Las dimensiones originales de la imagen se puede consultar con terra::ext()

ext(imagen)
## SpatExtent : 314085, 547815, 4345785, 4583115 (xmin, xmax, ymin, ymax)

Los objetos extent tienen una característica particular: se pueden cambiar de tamaño fácilmente. Por ejemplo, multiplicar la extensión por 0,5 reducirá la extensión proporcionalmente, pero manteniendo la ubicación geográfica del centroide. Un ejemplo es el siguiente:

borrame <- ext(imagen)
plot(borrame)
plot(borrame*0.5, add = TRUE)
rm(borrame)

Este recurso puede ser muy útil en ocasiones, por ejemplo, para una expansión/contracción rápida de las dimensiones de trazado sin tener que jugar con las coordenadas o con la extracción de un subconjunto.

► PASO 2: a continuación se concretarán los límites del área que se desea recortar. Para ello, se creará un objeto denominado roi a partir de la función terra::ext. Este objeto se creará modificando las dimensiones del objeto imagen.

roi <- ext(xmin(imagen) + 60000, 
           xmax(imagen) - 60000,
           ymin(imagen) + 55000, 
           ymax(imagen) - 83000)
# roi <- extent(400000,500000,4400000,4500000)                                  # Una forma alternativa
roi
## SpatExtent : 374085, 487815, 4400785, 4500115 (xmin, xmax, ymin, ymax)

► PASO 3: una vez disponible el objeto roi correspondiente al nuevo área de trabajo, se usará para recortar la imagen original con la función terra::crop[https://rspatial.github.io/terra/reference/crop.html].

imagen_recortada <- crop(imagen,
                         roi)                                  

► PASO 4. Podemos verficar el resultado de este recorte mediante sus metadatos y compararlos con los de la imagen original.

imagen_recortada
## class       : SpatRaster 
## dimensions  : 3311, 3791, 7  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 374085, 487815, 4400775, 4500105  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## source(s)   : memory
## names       :    B1,    B2,    B3,    B4,    B5,    B6, ... 
## min values  :  8437,  7612,  6537,  5771,  4752,  4697, ... 
## max values  : 65535, 65535, 65535, 65535, 65535, 65535, ...

Y también gráficamente mediante la impresión de una única banda con diferentes niveles de gris (en este caso, 256)

plot(imagen_recortada[["B6"]], col = gray.colors(256))
plot(roi, add = TRUE)

O con una imagen en color natural

plotRGB(imagen_recortada, r = 4, g = 3, b = 2, stretch = "lin")

Recorte a partir de un polígono.

En la mayoría de los casos, sobre todo cuando se trabaja sobre áreas con una delimitación irregular, por ejemplo, un límite administrativo (caso de un ayuntamiento, una comunidad autónoma o un parque nacional) es necesario recortar el objeto ráster inicial apoyándose en un fichero vectorial que incorpora esos límites irregulares.

El fichero vectorial puede añadirse desde el disco duro, en cuyo caso debe estar proyectado en proyectado en el mismo sistema CRS del objeto ráster, o se puede general interactivamente.

CASO 1

Si poseemos un fichero vectorial con los límites de la zona de interés almacenado en nuestro disco duro, podemos importarlo con la función terra::vect.

limites <- vect("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/recorte_imagenes/poligono.shp")
class(limites)
## [1] "SpatVector"
## attr(,"package")
## [1] "terra"

Como se ha señalado, es necesario que tanto el objeto raster como el vectorial tengan la misma proyección. Debe preguntarse a R qué tipo de CRS utilizan.

crs(imagen, 
    describe = TRUE)
##                    name authority  code
## 1 WGS 84 / UTM zone 30N      EPSG 32630
##                                                                                                                                                                                                                                                                                  area
## 1 Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)
##         extent
## 1 -6, 0, 0, 84

En el caso del objeto vectorial

crs(limites, describe = TRUE)
##      name authority code area         extent
## 1 unknown      <NA> <NA> <NA> NA, NA, NA, NA

Al no poseer CRS alguno, se le asigna uno nuevo, el correspondiente al objeto ráster

crs(limites) <- "EPSG:32630"

Se representa gráficamente para saber si existe correspondencia entre ambos objetos

plot(imagen_recortada[["B6"]], col = gray.colors(256))
plot(limites, add = TRUE, border = "yellow", lwd = 2)

Una vez establecido el CRS de interés en el objeto vectorial, se procede a su recorte y enmascaramiento.

imagen_recortada_bis <- crop(imagen_recortada, 
                             limites)
imagen_enmascarada_bis <- mask(imagen_recortada_bis, 
                           limites)                                  
plot(imagen_enmascarada_bis[["B4"]], col = gray.colors(256))

Y también gráficamente mediante una imagen en la que se combinan las bandas 5, 6 y 4, muy utilizada para la detección de superficie acuáticas.

plotRGB(imagen_enmascarada_bis, 
      r = 5, g =6, b = 4, 
      stretch = "lin")

CASO 2

Otra posibilidad es que el fichero vectorial se importe con un sistema de coordenadas de referencia ya establecido, como es el siguiente caso:

metro <- vect("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/recorte_imagenes/metro.geojson")

A continuación se compararán los sistemas de coordenadas del nuevo fichero vectorial y del fichero raster.

crs(metro, describe = TRUE)
##     name authority code area         extent
## 1 WGS 84      EPSG 4326 <NA> NA, NA, NA, NA

Debe cambiarse dicho CRS con la función terra::project.

metro <- project(metro, 
                "EPSG:32630")
crs(metro, describe = TRUE)
##                    name authority  code
## 1 WGS 84 / UTM zone 30N      EPSG 32630
##                                                                                                                                                                                                                                                                                  area
## 1 Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)
##         extent
## 1 -6, 0, 0, 84

Una vez transformado el CRS del fichero vectorial, se puede representar la imagen en formato ráster, y superpuestos, los límites del área de interés representados por el fichero vectorial. En este caso se utiliza la función Rstoolbox::plotRGB solicitando que, del objeto imagen, se representen sólo las bandas 6,5 y 4.

plotRGB(imagen[[6:4]], 
        stretch = "lin",
        axes = TRUE)
plot(metro, 
     border = "blue", 
     lwd = 4, 
     add = TRUE)

Una vez que el raster y el shapefile están en el mismo CRS, se puede crear la máscara.

► PASO 1. Recorte de la imagen (crea un recuadro con los límites máximo y mínimo de la zona de trabajo) con la función terra::crop().

crop <- crop(imagen, metro)
plotRGB(crop[[6:4]], 
        stretch = "lin",
        axes = TRUE)

► PASO 2. Recorte de la imagen usando como máscara el poligono con la función raster::mask. A continuación, su correspondiente representación gráfica en color natural (RGB 432)

imagen_enmascarada <- mask(crop, 
                         mask = metro)
plotRGB(imagen_enmascarada[[6:4]], 
        stretch = "lin",
        axes = TRUE)

Si se desea grabar el objeto resultante, habría que añadir a la función terra::maks dos argumentos:

  • filename = “./datos/recorte/imagen_recortada.tif” Ruta y nombre del fichero resultante.

  • overwrite = TRUE sobreescribe cualquier fichero anterior con el mism nombre.

Ejemplo (se exporta con formato .tif):

imagen_recortada <- mask(crop, 
                         mask = metro,
                         filename = "./mi_ruta/nombre_fichero.tif",
                         overwrite = TRUE)

Si desea agilizar todo este proceso, ambas funciones se pueden encadenar.

borrame <- mask(crop(imagen, metro), metro)
plotRGB(borrame[[5:3]], 
        stretch = "lin",
        axes = TRUE)

Recorte de una imagen manteniendo el área situada fuera del polígono.

Otra posibilidad, no muy frecuente, es el recorte de la zona de interés, pero vaciando su interior y manteniendo las áreas circundantes. Para ello, debe incluirse el argumento inverse = TRUE en la función raster::mask.

borrame <- mask(crop(imagen, metro), metro, 
                inverse = TRUE)
plotRGB(borrame[[4:2]], 
        stretch = "lin",
        axes = TRUE)

Recorte mediante otro fichero raster.

También es posible utilizar como fuente del área de interés otro fichero raster. De nuevo, ambos ficheros ráster deberían tener la misma proyección para que se puedan superponer.

mascara <- rast("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/recorte_imagenes/imagen_recortada.tif")
mascara
## class       : SpatRaster 
## dimensions  : 1973, 1984, 7  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 405675, 465195, 4450095, 4509285  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## source      : imagen_recortada.tif 
## names       : image~ada_1, image~ada_2, image~ada_3, image~ada_4, image~ada_5, image~ada_6, ... 
## min values  :       10076,        9268,        8278,        7456,        7015,        6331, ... 
## max values  :       52017,       51199,       40913,       46914,       57124,       65535, ...

Siguiendo el mismo procedimiento realizado en líneas precedentes, primero representaremos toda la imagen y posteriormente supenpodremos la imagen correspondiente al objeto mascara_raster.

plotRGB(imagen[[4:2]], 
        stretch = "lin", 
        axes = TRUE, 
        alpha = 100)                                          # Parámetro que define el nivel de transparencia
## Warning: [plot] alpha should be between 0 and 1
plotRGB(mascara[[4:2]], 
        stretch = "lin", 
        add = TRUE)

Una vez confirmado el grado de superposición entre ambas imágenes, se puede proceder a crear el subcojunto.

borrame <- crop(imagen, 
                mascara)
borrame
## class       : SpatRaster 
## dimensions  : 1973, 1984, 7  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 405675, 465195, 4450095, 4509285  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## source(s)   : memory
## names       :    B1,    B2,    B3,    B4,    B5,    B6, ... 
## min values  :  8567,  7741,  6537,  5981,  4752,  4723, ... 
## max values  : 65535, 65535, 65535, 65535, 65535, 65535, ...
plotRGB(borrame[[4:2]],
        stretch = "lin")

Recorte espectral

La selección de alguna banda específica de la imagen de trabajo se realiza mediante la función subset. Esta(s) nueva(s) imágen(es) pueden grabarse posteriormente en el disco duro especificando su nombre en el argumento filename. En el siguiente ejemplo se seleccionan las bandas correspondientes al verde y al rojo, situadas en las posiciones 2 y 3.

recorte_espectral <- subset(imagen_recortada, 
                            2:3)
recorte_espectral
## class       : SpatRaster 
## dimensions  : 3311, 3791, 2  (nrow, ncol, nlyr)
## resolution  : 30, 30  (x, y)
## extent      : 374085, 487815, 4400775, 4500105  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 30N (EPSG:32630) 
## source(s)   : memory
## names       :    B2,    B3 
## min values  :  7612,  6537 
## max values  : 65535, 65535
plot(recorte_espectral)

Se eliminan todos los objetos creados hasta el momento

rm(list=ls())

📝 **ACTIVIDAD DE EVALUACIÓN 1:

Cada alumno elaborará un script conteniendo los procedimientos necesarios para responder a las cuestiones planteadas en la siguiente actividad de evaluación. Una vez concluido, el script será enviado posteriormente al profesor a través de correo electrónico.

📝 **ACTIVIDAD DE EVALUACIÓN 2:

Cada alumno enviará al profesor un correo electrónico conteniendo el fichero que delimite el área de trabajo (ROI) que será utilizado en su trabajo individual como el script con el procedimiento que llevaron a cabo para su selección.