El seguiment ambiental, l'agricultura, la planificació urbana, la gestió de desastres i els estudis sobre el canvi climàtic s'han beneficiat de l'anàlisi d'imatges per satèl·lit.
Podem obtenir informació significativa sobre les característiques, els canvis i la dinàmica del nostre planeta aprofitant la quantitat massiva de dades registrades pels satèl·lits d'observació de la Terra.
Python, un llenguatge de programació versàtil i fort, ofereix un ric ecosistema de biblioteques i eines per a un processament ràpid i eficaç d'imatges de satèl·lit.
L'ús de anàlisi d'imatges de satèl·lit obre un món de possibilitats. Ens permet extreure informació útil de fotos de satèl·lit, com ara la categorització de la coberta del sòl, l'avaluació de la salut de la vegetació, el seguiment de l'expansió urbana i el mapeig de la costa.
Podem processar, mostrar i analitzar fàcilment imatges de satèl·lit aprofitant la versatilitat i mòduls de Python com ara rasterio, numpy i matplotlib.
Un dels principals avantatges d'utilitzar Python per a l'anàlisi d'imatges per satèl·lit és la seva àmplia gamma de mòduls de processament de dades geoespacials.
Rasterio, per exemple, té una interfície senzilla per llegir i modificar la informació ràster, la qual cosa la fa adequada per treballar amb fitxers d'imatges de satèl·lit.
El mòdul numpy proporciona operacions de matriu sofisticades per realitzar càlculs ràpids i estadístiques sobre dades d'imatge. Matplotlib també ens permet generar visuals rellevants per ajudar en la interpretació i comunicació dels resultats analítics.
A les seccions següents, veurem exemples reals i fragments de codi per mostrar com es pot utilitzar Python per analitzar fotos de satèl·lit.
Explicarem com obrir fotografies de satèl·lit, visualitzar dades d'imatge, extreure metadades, calcular estadístiques de banda i realitzar anàlisis particulars com l'índex de vegetació de diferència normalitzada (NDVI).
Aquests exemples us ajudaran a començar en el tema intrigant de l'anàlisi d'imatges de satèl·lit amb Python.
Primer, hem d'importar algunes biblioteques per ajudar-nos amb la nostra tasca.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
1. Visualització i obertura de la imatge de satèl·lit
Farem la biblioteca Rasterio en aquesta secció per accedir a la imatge de satèl·lit que ens proporciona la ruta_imatge_satèl·lit.
El fitxer d'imatge s'obre mitjançant el mètode rasterio.open() i l'objecte resultant, satellite_image, representa la imatge oberta.
Per a aquesta tasca, he utilitzat la imatge d'aquest enllaç: https://unsplash.com/photos/JiuVoQd-ZLk i l'he desat al meu ordinador com a "satellite.jpg".
# Open the satellite image using rasterio
satellite_image_path = 'satellite.jpg'
satellite_image = rasterio.open(satellite_image_path)
Després d'obrir la imatge, la llegim com una matriu utilitzant la funció read() de l'objecte satellite_image. Els valors de píxels per a cada banda de les imatges de satèl·lit s'emmagatzemen a la matriu d'imatges.
# Read the image as an array
image_array = satellite_image.read()
Per avaluar visualment la imatge del satèl·lit, utilitzem l'eina matplotlib.pyplot per generar una figura de 10 × 10 polzades.
La matriu d'imatges es mostra amb el mètode imshow(). L'operació transposa (1, 2, 0) s'utilitza per reordenar les dimensions de la matriu d'imatges per adaptar-se a l'ordre previst per imshow().
Finalment, axis('off') amaga les etiquetes dels eixos, donant una visió clara de la imatge del satèl·lit.
# Visualize the image
plt.figure(figsize=(10, 10))
plt.imshow(image_array.transpose(1, 2, 0))
plt.axis('off')
plt.show()
2. Extracció de metadades
Extraurem informació de metadades vitals sobre la imatge del satèl·lit després d'obrir-la i mostrar-la. Aquesta informació ens ajuda a entendre les qualitats de la imatge i ofereix context per a futures investigacions.
image_width = satellite_image.width
image_height = satellite_image.height
image_crs = satellite_image.crs
image_count = satellite_image.count
print("Image Width:", image_width)
print("Image Height:", image_height)
print("Coordinate Reference System:", image_crs)
print("Number of Bands:", image_count)
Utilitzant els atributs width i height de l'objecte satellite_image, extreim l'amplada i l'alçada de la imatge. La propietat crs s'utilitza per recuperar el sistema de referència de coordenades (CRS) de la imatge.
El CRS proporciona informació sobre el sistema de referència espacial de la imatge, la qual cosa ens permet relacionar les coordenades de la imatge amb els llocs del món real.
Finalment, utilitzem l'atribut count de l'objecte satellite_image per calcular el nombre de bandes de la imatge. Aquestes dades són crítiques per a una anàlisi posterior perquè ens permeten obtenir els valors de píxels per a cada banda de la matriu d'imatge.
3. Càlcul estadístic de bandes
Calculem les estadístiques per a cada banda de la matriu d'imatges d'aquesta part. Un bucle itera per cada banda i les funcions min, max, mean i std de la biblioteca numpy s'utilitzen per calcular aquestes estadístiques.
Una llista de diccionaris emmagatzema les estadístiques de cada banda.
band_stats = []
for band in range(image_count):
band_data = image_array[band]
band_min = np.min(band_data)
band_max = np.max(band_data)
band_mean = np.mean(band_data)
band_std = np.std(band_data)
band_stats.append({'Band': band+1, 'Min': band_min, 'Max': band_max, 'Mean': band_mean, 'Std': band_std})
print("Band Statistics:")
for stats in band_stats:
print(stats)
El bucle recorre cada banda, amb la banda variable que representa l'índex de banda. Utilitzant image_array[band], extreu els valors de píxels de la matriu d'imatge per a cada banda.
Aleshores, per a la banda actual, s'utilitzen les funcions np.min(), np.max(), np.mean() i np.std() per determinar el mínim, el màxim, la mitjana i la desviació estàndard del píxel. valors.
Les dades calculades per a cada banda es guarden en un diccionari amb tecles com "Band", "Min", "Max", "Mean" i "Std. Cada diccionari s'adjunta a la llista d'estadístiques de banda. Finalment, les dades de cada banda s'imprimeixen a la consola.
4. Càlcul NDVI (Normalized Difference Vegetation Index).
L'NDVI és una mesura popular per mesurar la salut de les plantes. En aquesta secció, comprovem si la imatge inclou almenys quatre bandes, que són necessàries per al càlcul NDVI.
red_band = None
nir_band = None
if image_count >= 4:
red_band = image_array[2] # assuming red band is at index 2
nir_band = image_array[3] # assuming near-infrared band is at index 3
if red_band is not None and nir_band is not None:
ndvi = (nir_band - red_band) / (nir_band + red_band)
# Visualize the NDVI
plt.figure(figsize=(10, 10))
plt.imshow(ndvi, cmap='RdYlGn')
plt.colorbar(label='NDVI')
plt.title('Normalized Difference Vegetation Index (NDVI)')
plt.axis('off')
plt.show()
else:
print("Error: The satellite image does not have the required bands for NDVI calculation.")
Per començar, establim les variables red_band i nir_band a Cap. La variable image_count s'utilitza llavors per determinar si la imatge conté almenys quatre bandes.
Si és així, deduïm que la banda vermella és l'índex 2 i la banda de l'infraroig proper (NIR) és l'índex 3. Les bandes coincidents de la matriu d'imatge s'assignen a les variables red_band i nir_band.
Si les dues bandes vermelles i NIR són accessibles, l'NDVI es calcula mitjançant la fórmula (NIR – Vermell) / (NIR + Vermell). Els números NDVI que resulten indiquen l'índex de vegetació per a cada píxel de la imatge.
A continuació, veiem l'NDVI creant una nova figura i mostrant la matriu NDVI mitjançant imshow(). El mètode colorbar() afegeix una barra de colors a la trama, donant als valors NDVI una referència visual.
Per centrar-nos completament en la pantalla NDVI, a més especifiquem un títol per a la trama i eliminem les etiquetes dels eixos amb axis('off'). Finalment, la trama es mostra amb plt.show().
S'escriu un missatge d'error a la consola si la imatge no té les bandes necessàries per al càlcul NDVI (és a dir, menys de quatre bandes).
5. Tancament de la imatge de satèl·lit
La millor pràctica és utilitzar la funció close() per tancar el fitxer d'imatge del satèl·lit després de realitzar l'anàlisi i la visualització. Això allibera qualsevol recurs del sistema vinculat al fitxer d'imatge.
satellite_image.close()
Aquí teniu la meva solució:
Això és!
Notes Finals
El paper de Python per ajudar a l'estudi d'aquests conjunts de dades massius és cada cop més important a mesura que augmenta la disponibilitat i la resolució de les imatges de satèl·lit.
La capacitat d'utilitzar Python per accedir, processar, analitzar i mostrar imatges de satèl·lit ofereix el camí per a aplicacions creatives i coneixements que poden impulsar un bon canvi i un major coneixement del nostre món.
Recordeu explorar la gran selecció de recursos, tutorials i biblioteques disponibles per augmentar els vostres coneixements i habilitats mentre continueu la vostra aventura en l'anàlisi d'imatges per satèl·lit amb Python.
Continua interessant-te, explora i utilitza les habilitats de Python per descobrir els misteris enterrats a les imatges de satèl·lit.
Deixa un comentari