💡 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:
Modelo digital del terreno (formato ráster):
fichero mdt.tif
Fichero en formato vectorial con los límites de la Comunidad de
Madrid: comunidad.shp
.
Fichero en formato vectorial con los límites del ayuntamiento de
Madrid: metro.geojson
.
► Imagen Landsat. Ficheros en formato ráster correspondientes a una escena de Landsat tomada
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.
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.
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:
Carpeta ./datos/recorte/imagen_monobanda.
Carpeta ./datos/recorte/imagen_landsat.
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í
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)
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.
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")
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.
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")
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)
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)
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")
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.