Omgewingsmonitering, landbou, stedelike beplanning, rampbestuur en klimaatsveranderingstudies het almal baat gevind by satellietbeeldontleding.
Ons kan beduidende insigte in ons planeet se kenmerke, veranderinge en dinamika verkry deur die massiewe hoeveelheid data wat deur aardewaarnemingsatelliete aangeteken is, te ontgin.
Python, 'n veelsydige en sterk programmeertaal, bied 'n ryk ekosisteem van biblioteke en gereedskap vir vinnige en effektiewe satellietbeeldverwerking.
Die gebruik van satellietbeeldontleding maak 'n wêreld van moontlikhede oop. Dit stel ons in staat om nuttige inligting uit satellietfoto's te onttrek, soos grondbedekkingskategorisering, plantegroeigesondheidsevaluering, opsporing van stedelike uitbreiding en kuslynkartering.
Ons kan maklik satellietbeelde verwerk, vertoon en ontleed deur Python se veelsydigheid en modules soos rasterio, numpy en matplotlib te ontgin.
Een van die primêre voordele van die gebruik van Python vir satellietbeeldontleding is die wye reeks georuimtelike dataverwerkingsmodules.
Rasterio het byvoorbeeld 'n eenvoudige koppelvlak om rasterinligting te lees en te wysig, wat dit geskik maak om met satellietbeeldlêers te werk.
Die numpy module bied gesofistikeerde skikking bewerkings vir die uitvoering van vinnige berekeninge en statistieke op prent data. Matplotlib stel ons ook in staat om relevante beeldmateriaal te genereer om te help met die interpretasie en kommunikasie van analitiese resultate.
In die volgende afdelings sal ons na werklike voorbeelde en kodebrokkies kyk om te wys hoe Python gebruik kan word om satellietfoto's te ontleed.
Ons sal gaan oor hoe om satellietfoto's oop te maak, beelddata te visualiseer, metadata te onttrek, bandstatistieke te bereken en spesifieke analise uit te voer soos die Normalized Difference Vegetation Index (NDVI).
Hierdie voorbeelde sal jou help om te begin met die intrige onderwerp van satellietbeelde-analise met Python.
Eerstens moet ons 'n paar biblioteke invoer om ons met ons taak te help.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
1. Visualisering en oopmaak van die satellietbeeld
Ons sal die Rasterio-biblioteek in hierdie afdeling om toegang te verkry tot die satellietbeeld wat deur die satelliet_beeld_pad verskaf word.
Die beeldlêer word oopgemaak met behulp van die rasterio.open() metode, en die resulterende voorwerp, satelliet_beeld, verteenwoordig die oopgemaakte beeld.
Vir hierdie taak het ek die prent van hierdie skakel gebruik: https://unsplash.com/photos/JiuVoQd-ZLk en dit op my rekenaar gestoor as “satellite.jpg”.
# Open the satellite image using rasterio
satellite_image_path = 'satellite.jpg'
satellite_image = rasterio.open(satellite_image_path)
Nadat ons die prent oopgemaak het, lees ons dit as 'n skikking deur die satelliet_beeld-voorwerp se read()-funksie te gebruik. Die pixelwaardes vir elke band van die satellietbeelde word in die beeldskikking gestoor.
# Read the image as an array
image_array = satellite_image.read()
Om die satellietprent visueel te evalueer, gebruik ons die matplotlib.pyplot-instrument om 'n 10×10-duim figuur te genereer.
Die prentjie skikking word getoon met behulp van die imshow() metode. Die transponeer(1, 2, 0)-bewerking word gebruik om die prentskikking se afmetings te herrangskik om te pas by die volgorde wat deur imshow( verwag word).
Laastens versteek as('af') die as-etikette, wat 'n duidelike beeld van die satellietbeeld gee.
# Visualize the image
plt.figure(figsize=(10, 10))
plt.imshow(image_array.transpose(1, 2, 0))
plt.axis('off')
plt.show()
2. Metadata-onttrekking
Ons onttrek belangrike metadata-inligting oor die satellietfoto nadat ons dit oopgemaak en vertoon het. Hierdie inligting help ons om die beeld se kwaliteite te verstaan en bied konteks vir toekomstige ondersoek.
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)
Deur die breedte- en hoogte-kenmerke van die satellietbeeldvoorwerp te gebruik, onttrek ons die beeldbreedte en hoogte. Die crs-eienskap word gebruik om die beeld se koördinaatverwysingstelsel (CRS) te herwin.
Die CRS gee inligting oor die prent se ruimtelike verwysingstelsel, wat ons in staat stel om beeldkoördinate by werklike plekke te pas.
Laastens gebruik ons die telkenmerk van die satellietbeeldvoorwerp om die aantal bande in die beeld te bereken. Hierdie data is van kritieke belang vir latere ontleding, want dit stel ons in staat om die pixelwaardes vir elke band in die prentskikking te verkry.
3. Bandstatistiekberekening
Ons bereken statistieke vir elke band in die prentjie-skikking in hierdie deel. 'n Lus herhaal oor elke band, en die numpy-biblioteek se min-, maks-, gemiddelde- en std-funksies word gebruik om hierdie statistieke te bereken.
'n Lys van woordeboeke stoor die statistieke vir elke band.
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)
Die lus siklusse oor elke band, met die veranderlike band wat die bandindeks verteenwoordig. Deur beeld_skikking[band] te gebruik, onttrek ons die pixelwaardes uit die beeldskikking vir elke band.
Dan, vir die huidige band, word die np.min(), np.max(), np.mean() en np.std() funksies gebruik om die minimum, maksimum, gemiddelde en standaardafwyking van die pixel te bepaal waardes.
Die berekende data vir elke band word in 'n woordeboek gestoor met sleutels soos 'Band', 'Min', 'Max', 'Mean' en 'Std. Elke woordeboek word by die lys van bandstatistieke aangeheg. Ten slotte word elke band se data na die konsole gedruk.
4. NDVI (Normalized Difference Vegetation Index) Berekening
Die NDVI is 'n gewilde maatstaf om die gesondheid van plante te meet. In hierdie afdeling kyk ons of die prent ten minste vier bande bevat wat vir NDVI-berekening vereis word.
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.")
Om te begin, stel ons die rooi_band en nir_band veranderlikes op Geen. Die image_count-veranderlike word dan gebruik om te bepaal of die beeld ten minste vier bande bevat.
Indien wel, lei ons af die rooi band is indeks 2 en die naby-infrarooi (NIR) band is indeks 3. Die ooreenstemmende bande van die prentskikking word aan die veranderlikes rooi_band en nir_band toegeken.
As beide die rooi en NIR-bande toeganklik is, word die NDVI bereken deur die formule (NIR – Rooi) / (NIR + Rooi) te gebruik. Die NDVI-getalle wat ontstaan, dui die plantegroei-indeks vir elke pixel in die prent aan.
Ons sien dan die NDVI deur 'n nuwe figuur te skep en die NDVI-skikking te vertoon met behulp van imshow(). Die colorbar()-metode voeg 'n kleurbalk by die plot, wat die NDVI-waardes 'n visuele verwysing gee.
Om heeltemal op die NDVI-vertoning te fokus, spesifiseer ons ook 'n byskrif vir die plot en verwyder die as-etikette met as ('af'). Laastens word die plot getoon met plt.show().
'n Foutboodskap word na die konsole geskryf as die prentjie nie die vereiste bande vir NDVI-berekening het nie (dws minder as vier bande).
5. Bring die satellietbeeld tot 'n einde
Dit is die beste praktyk om die close()-funksie te gebruik om die satellietbeeldlêer toe te maak nadat die ontleding en besigtiging uitgevoer is. Dit bevry enige stelselhulpbronne wat aan die prentlêer gekoppel is.
satellite_image.close()
Hier is my oplossing:
Dis dit!
Finale Notes
Python se rol in die studie van hierdie massiewe datastelle word al hoe belangriker namate die beskikbaarheid en resolusie van satellietbeelde toeneem.
Die vermoë om Python te gebruik om toegang tot, verwerk, ontleed en wys satellietbeelde bied die pad vir kreatiewe toepassings en insigte wat goeie verandering en groter kennis van ons wêreld kan aandryf.
Onthou om die groot verskeidenheid hulpbronne, tutoriale en biblioteke wat beskikbaar is, te verken om jou kennis en vermoëns te vergroot terwyl jy voortgaan met jou avontuur in satellietbeeldontleding deur Python te gebruik.
Hou aan om belang te stel, te verken en Python se vermoëns te gebruik om die raaisels wat in satellietfoto's begrawe is, te ontbloot.
Lewer Kommentaar