Οι μελέτες περιβαλλοντικής παρακολούθησης, γεωργίας, πολεοδομικού σχεδιασμού, διαχείρισης καταστροφών και κλιματικής αλλαγής έχουν ωφεληθεί από την ανάλυση δορυφορικών εικόνων.
Μπορούμε να αποκτήσουμε σημαντικές γνώσεις για τα χαρακτηριστικά, τις αλλαγές και τη δυναμική του πλανήτη μας, αξιοποιώντας τον τεράστιο όγκο δεδομένων που καταγράφονται από δορυφόρους παρατήρησης της Γης.
Η Python, μια ευέλικτη και ισχυρή γλώσσα προγραμματισμού, προσφέρει ένα πλούσιο οικοσύστημα βιβλιοθηκών και εργαλείων για γρήγορη και αποτελεσματική επεξεργασία δορυφορικών εικόνων.
Η χρήση των ανάλυση δορυφορικών εικόνων ανοίγει έναν κόσμο δυνατοτήτων. Μας δίνει τη δυνατότητα να εξάγουμε χρήσιμες πληροφορίες από δορυφορικές φωτογραφίες, όπως η κατηγοριοποίηση της κάλυψης της γης, η αξιολόγηση της υγείας της βλάστησης, η παρακολούθηση της αστικής επέκτασης και η χαρτογράφηση ακτών.
Μπορούμε εύκολα να επεξεργαστούμε, να εμφανίσουμε και να αναλύσουμε δορυφορικές εικόνες εκμεταλλευόμενοι την ευελιξία και τις ενότητες της Python όπως το rasterio, το numpy και το matplotlib.
Ένα από τα κύρια πλεονεκτήματα της χρήσης της Python για ανάλυση δορυφορικών εικόνων είναι το ευρύ φάσμα ενοτήτων επεξεργασίας γεωχωρικών δεδομένων.
Το Rasterio, για παράδειγμα, έχει μια απλή διεπαφή για την ανάγνωση και την τροποποίηση πληροφοριών ράστερ, καθιστώντας το κατάλληλο για εργασία με αρχεία δορυφορικών εικόνων.
Η μονάδα numpy παρέχει εξελιγμένες λειτουργίες συστοιχίας για την εκτέλεση γρήγορων υπολογισμών και στατιστικών στοιχείων σε δεδομένα εικόνας. Το Matplotlib μας δίνει επίσης τη δυνατότητα να δημιουργήσουμε σχετικά οπτικά στοιχεία για να βοηθήσουμε στην ερμηνεία και την επικοινωνία των αναλυτικών αποτελεσμάτων.
Στις επόμενες ενότητες, θα δούμε πραγματικά παραδείγματα και αποσπάσματα κώδικα για να δείξουμε πώς μπορεί να χρησιμοποιηθεί η Python για την ανάλυση δορυφορικών φωτογραφιών.
Θα εξετάσουμε πώς να ανοίγουμε δορυφορικές φωτογραφίες, να οπτικοποιούμε δεδομένα απεικόνισης, να εξάγουμε μεταδεδομένα, να υπολογίζουμε στατιστικά ζώνης και να κάνουμε συγκεκριμένες αναλύσεις όπως ο Δείκτης Κανονικής Διαφοράς Βλάστησης (NDVI).
Αυτά τα παραδείγματα θα σας βοηθήσουν να ξεκινήσετε με το ενδιαφέρον θέμα της ανάλυσης δορυφορικών εικόνων με την Python.
Πρώτα, πρέπει να εισαγάγουμε κάποιες βιβλιοθήκες για να μας βοηθήσουν στην εργασία μας.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
1. Οπτικοποίηση και άνοιγμα της δορυφορικής εικόνας
Θα χρησιμοποιήσουμε τη βιβλιοθήκη Rasterio σε αυτήν την ενότητα για πρόσβαση στη δορυφορική εικόνα που παρέχεται από το satellite_image_path.
Το αρχείο εικόνας ανοίγει χρησιμοποιώντας τη μέθοδο rasterio.open() και το αντικείμενο που προκύπτει, satellite_image, αντιπροσωπεύει την ανοιγμένη εικόνα.
Για αυτήν την εργασία, χρησιμοποίησα την εικόνα από αυτόν τον σύνδεσμο: https://unsplash.com/photos/JiuVoQd-ZLk και την έχω αποθηκεύσει στον υπολογιστή μου ως "satellite.jpg".
# Open the satellite image using rasterio
satellite_image_path = 'satellite.jpg'
satellite_image = rasterio.open(satellite_image_path)
Αφού ανοίξουμε την εικόνα, τη διαβάζουμε ως πίνακα χρησιμοποιώντας τη συνάρτηση read() του αντικειμένου satellite_image. Οι τιμές των εικονοστοιχείων για κάθε ζώνη των δορυφορικών εικόνων αποθηκεύονται στη συστοιχία εικόνων.
# Read the image as an array
image_array = satellite_image.read()
Για να αξιολογήσουμε οπτικά τη δορυφορική εικόνα, χρησιμοποιούμε το εργαλείο matplotlib.pyplot για να δημιουργήσουμε μια εικόνα 10×10 ιντσών.
Ο πίνακας εικόνων εμφανίζεται χρησιμοποιώντας τη μέθοδο imshow(). Η λειτουργία transpose(1, 2, 0) χρησιμοποιείται για την αναδιάταξη των διαστάσεων του πίνακα εικόνων ώστε να ταιριάζει με τη σειρά που προβλέπεται από το imshow().
Τέλος, το axis('off') κρύβει τις ετικέτες των αξόνων, δίνοντας μια σαφή εικόνα της δορυφορικής εικόνας.
# Visualize the image
plt.figure(figsize=(10, 10))
plt.imshow(image_array.transpose(1, 2, 0))
plt.axis('off')
plt.show()
2. Εξαγωγή Μεταδεδομένων
Εξάγουμε ζωτικής σημασίας πληροφορίες μεταδεδομένων σχετικά με τη δορυφορική εικόνα μετά το άνοιγμα και την εμφάνιση της. Αυτές οι πληροφορίες μας βοηθούν να κατανοήσουμε τις ιδιότητες της εικόνας και προσφέρουν ένα πλαίσιο για μελλοντική έρευνα.
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)
Χρησιμοποιώντας τις ιδιότητες πλάτους και ύψους του αντικειμένου satellite_image, εξάγουμε το πλάτος και το ύψος της εικόνας. Η ιδιότητα crs χρησιμοποιείται για την ανάκτηση του συστήματος αναφοράς συντεταγμένων της εικόνας (CRS).
Το CRS παρέχει πληροφορίες για το χωρικό σύστημα αναφοράς της εικόνας, επιτρέποντάς μας να αντιστοιχίσουμε συντεταγμένες εικόνας με μέρη του πραγματικού κόσμου.
Τέλος, χρησιμοποιούμε το χαρακτηριστικό count του αντικειμένου satellite_image για να υπολογίσουμε τον αριθμό των ζωνών στην εικόνα. Αυτά τα δεδομένα είναι κρίσιμα για μεταγενέστερη ανάλυση, επειδή μας επιτρέπουν να λάβουμε τις τιμές pixel για κάθε ζώνη στη διάταξη εικόνων.
3. Υπολογισμός στατιστικών ζώνης
Υπολογίζουμε στατιστικά στοιχεία για κάθε ζώνη στον πίνακα εικόνων σε αυτό το μέρος. Ένας βρόχος επαναλαμβάνεται σε κάθε ζώνη και οι συναρτήσεις min, max, mean και std της numpy βιβλιοθήκης χρησιμοποιούνται για τον υπολογισμό αυτών των στατιστικών.
Μια λίστα λεξικών αποθηκεύει τα στατιστικά στοιχεία για κάθε ζώνη.
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)
Ο βρόχος κυκλώνει σε κάθε ζώνη, με τη μεταβλητή ζώνη να αντιπροσωπεύει τον δείκτη ζώνης. Χρησιμοποιώντας το image_array[band], εξάγουμε τις τιμές των pixel από τον πίνακα εικόνας για κάθε ζώνη.
Στη συνέχεια, για την τρέχουσα ζώνη, οι συναρτήσεις np.min(), np.max(), np.mean() και np.std() χρησιμοποιούνται για τον προσδιορισμό της ελάχιστης, μέγιστης, μέσης και τυπικής απόκλισης του εικονοστοιχείου αξίες.
Τα υπολογισμένα δεδομένα για κάθε ζώνη αποθηκεύονται σε ένα λεξικό με πλήκτρα όπως "Band", "Min", "Max", "Mean" και "Std. Κάθε λεξικό προσαρτάται στη λίστα με τα στατιστικά της μπάντας. Τέλος, τα δεδομένα κάθε μπάντας εκτυπώνονται στην κονσόλα.
4. Υπολογισμός NDVI (Normalized Difference Vegetation Index).
Το NDVI είναι ένα δημοφιλές μέτρο για τη μέτρηση της υγείας των φυτών. Σε αυτήν την ενότητα, ελέγχουμε για να δούμε αν η εικόνα περιλαμβάνει τουλάχιστον τέσσερις ζώνες, οι οποίες απαιτούνται για τον υπολογισμό 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.")
Αρχικά, ορίσαμε τις μεταβλητές red_band και nir_band σε None. Στη συνέχεια, η μεταβλητή image_count χρησιμοποιείται για να προσδιοριστεί εάν η εικόνα περιέχει τουλάχιστον τέσσερις ζώνες.
Αν ναι, συμπεραίνουμε ότι η κόκκινη ζώνη είναι δείκτης 2 και η ζώνη κοντινού υπερύθρου (NIR) είναι δείκτης 3. Οι ζώνες που ταιριάζουν από τον πίνακα εικόνων αντιστοιχίζονται στις μεταβλητές red_band και nir_band.
Εάν είναι προσβάσιμες και οι δύο ζώνες κόκκινου και NIR, το NDVI υπολογίζεται χρησιμοποιώντας τον τύπο (NIR – Red) / (NIR + Red). Οι αριθμοί NDVI που προκύπτουν υποδεικνύουν τον δείκτη βλάστησης για κάθε pixel στην εικόνα.
Στη συνέχεια, βλέπουμε το NDVI δημιουργώντας ένα νέο σχήμα και εμφανίζοντας τον πίνακα NDVI χρησιμοποιώντας το imshow(). Η μέθοδος colorbar() προσθέτει μια γραμμή χρώματος στην γραφική παράσταση, δίνοντας στις τιμές NDVI μια οπτική αναφορά.
Για να εστιάσουμε εξ ολοκλήρου στην οθόνη NDVI, ορίζουμε επιπλέον μια λεζάντα για την γραφική παράσταση και αφαιρούμε τις ετικέτες των αξόνων με τον άξονα ('off'). Τέλος, η γραφική παράσταση εμφανίζεται με plt.show().
Ένα μήνυμα σφάλματος γράφεται στην κονσόλα εάν η εικόνα δεν διαθέτει τις απαραίτητες ζώνες για τον υπολογισμό NDVI (δηλαδή, λιγότερες από τέσσερις ζώνες).
5. Κλείσιμο της δορυφορικής εικόνας
Είναι βέλτιστη πρακτική να χρησιμοποιείτε τη συνάρτηση close() για να κλείσετε το αρχείο δορυφορικής εικόνας μετά τη διεξαγωγή της ανάλυσης και της προβολής. Αυτό απελευθερώνει τυχόν πόρους συστήματος που συνδέονται με το αρχείο εικόνας.
satellite_image.close()
Εδώ είναι η λύση μου:
Αυτό είναι!
τελική Σημειώσεις
Ο ρόλος της Python στην υποβοήθηση της μελέτης αυτών των τεράστιων συνόλων δεδομένων γίνεται όλο και πιο σημαντικός καθώς αυξάνεται η διαθεσιμότητα και η ανάλυση των δορυφορικών εικόνων.
Η δυνατότητα χρήσης της Python για πρόσβαση, επεξεργασία, ανάλυση και εμφάνιση δορυφορικών εικόνων προσφέρει το μονοπάτι για δημιουργικές εφαρμογές και ιδέες που μπορεί να οδηγήσουν σε καλές αλλαγές και μεγαλύτερη γνώση του κόσμου μας.
Θυμηθείτε να εξερευνήσετε τη μεγάλη ποικιλία πόρων, σεμιναρίων και βιβλιοθηκών που είναι διαθέσιμες για να αυξήσετε τις γνώσεις και τις ικανότητές σας καθώς συνεχίζετε την περιπέτειά σας στην ανάλυση δορυφορικών εικόνων χρησιμοποιώντας Python.
Συνεχίστε να ενδιαφέρεστε, να εξερευνάτε και να χρησιμοποιείτε τις ικανότητες της Python για να αποκαλύψετε τα μυστήρια που είναι θαμμένα μέσα στις δορυφορικές εικόνες.
Αφήστε μια απάντηση