[PYTHON] Jetons un coup d'œil à l'incendie de forêt sur la côte ouest des États-Unis avec des images satellites.

(Mise à jour) Mise à jour de la méthode de création d'une image composite.

Aperçu

Jusqu'à présent, nous avons introduit l'acquisition d'images satellitaires de la série de satellites artificiels européens Sentinel à l'aide de Google Earth Engine et de sa méthode d'analyse. Cette fois, nous présenterons la méthode d'acquisition et d'analyse des images satellites de Sentinel-2, qui est un satellite d'observation optique familier à tous les membres de la série Sentinel. Cette fois, jetons un coup d'œil sur l'incendie de forêt sur la côte ouest des États-Unis rapporté dans les nouvelles d'outre-mer.  Portland (1).jpg

Il s'agit d'une image satellite d'un site d'incendie de forêt près de Portland sur la côte ouest des États-Unis (prise le 9 septembre 2020).

Il est rapporté comme suit sur les sites d'information à l'étranger. Ce site a une histoire d'incendies de forêt, et vous pouvez découvrir où l'incendie s'est produit.  Fire Maps: Glass and Zogg Wildfire Tracker

Quant à la situation du site, les sites suivants peuvent être réels et pressés. Le New York Times a beaucoup d'articles intéressants que je lis tous les jours.  Historic Wild Fires Range in Western States

Ici, nous allons présenter un exemple de la façon d'acquérir l'image observée de Sentinel-2 avec Google Earth Engine et comment convertir les données d'image en une image couleur. De plus, le code introduit dans l'article est placé sur Github, donc si vous voulez l'essayer vous-même, veuillez l'utiliser. ** Google colaboratory est utilisé **, vous pouvez donc l'utiliser quel que soit le PC tant que vous disposez d'un environnement réseau **.

1.Tout d'abord

Auparavant, en utilisant l'API de Sentinel, j'ai acquis une image capturée par un satellite artificiel d'un feu de forêt australien au début de 2020 et en ai créé une animation GIF.

J'ai fait un laps de temps d'images satellites des incendies de forêt australiens.

Ici, l'image carrée standard de 100 km de Sentinel-2 a été acquise à l'aide de l'API, et la partie d'intérêt a été découpée et le traitement de la composition des couleurs a été effectué. À ce stade, la scène sera différente en fonction de la synchronisation de l'image, de sorte que l'image présente quelques encoches. Même s'il s'agit de scènes différentes, vous pouvez obtenir une image de l'ensemble de la zone d'intérêt en acquérant et en fusionnant chacune d'elles. Cependant, la gestion de plusieurs images de grande taille n'est pas très efficace compte tenu du temps d'acquisition. Par conséquent, cette fois, nous allons acquérir l'image découpée dans la zone d'intérêt à partir du moteur Google Earth Engine (ci-après désigné GEE) et créer une image composite couleur.   La série Sentinel est une série d'observation de la Terre développée et exploitée par l'Agence spatiale européenne, et a déjà été lancée et exploitée de 1 à 5. Cette fois, nous allons introduire le traitement d'image à partir de l'acquisition d'images satellites de Sentinel-2, qui capture des images d'observation optique ainsi que des images d'appareils photo numériques.

sentinel2.jpeg Sentinel-2 ©ESA 2000-2018.

Pour plus de détails sur le plan d'observation et les images d'observation de Sentinel-2, voir Comment obtenir gratuitement les dernières images satellite. .

Sentinel-2 capture des images de 12 longueurs d'onde différentes.

スクリーンショット 2020-02-15 17.45.33.png (Credit: European Space Agency)

Une image satellite générale (True color) peut être créée en définissant les bandes 4, 3 et 2 sur R, V et B.

Cette fois, nous nous concentrerons sur les incendies de forêt et essayerons de visualiser les incendies à l'aide d'images d'observation des longueurs d'onde infrarouges. Cette fois, je me réfère aux articles suivants.

How to use open source satellite data for your investigative reportingHow to use open source satellite data for your investigative reporting

À partir de cet article, jetons un coup d'œil à la scène des feux de forêt en utilisant des images des longues bandes de longueurs d'onde 12 et 11 qui sont sensibles au feu et 8A qui est sensible à la forêt.

2. Acquisition et évaluation d'images satellites

2.1 Préparation de l'environnement (construction).

Veuillez vous référer à l'article suivant pour plus de détails sur la façon d'acquérir des images satellite avec GEE. Analyse d'images satellites artificielles par Google Earth Engine et Google Colab-Analyse d'images satellite à partir de gratuitement (Introduction) -

Veuillez également vous référer à l'article suivant pour la méthode d'analyse des images satellites obtenues auprès de GEE.

J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.

Bien qu'il y ait quelques chevauchements, nous allons introduire l'acquisition d'images satellites et leur traitement.

import ee
import numpy as np
import matplotlib.pyplot as plt

ee.Authenticate()
ee.Initialize()

Tout d'abord, exécutez ceci pour authentifier la connexion GEE. Lorsque vous l'exécutez, le lien sera retourné. Cliquez dessus pour effectuer la procédure d'authentification, copiez le code d'accès et saisissez-le.

Ensuite, authentifiez la connexion à Google Drive. Encore une fois, le flux est le même que celui de la certification GEE.

from google.colab import drive
drive.mount('/content/drive')

Ensuite, nous effectuerons des tâches telles que la visualisation des images satellites acquises et l'installation des modules nécessaires à leur numérisation et à leur analyse.

#Installation du package&importer
!pip install rasterio
import numpy as np
import matplotlib.pyplot as plt
import rasterio

import json
import os
import glob

import time
from datetime import datetime
from dateutil.parser import parse

Les modules fréquemment utilisés sont déjà installés dans Google Colaboratory, donc aucun travail supplémentaire n'est requis, mais cette fois nous utiliserons Geotiff, qui est une image avec des informations cartographiques ajoutées, donc il est nécessaire pour le traitement d'image ** Rasterio Installez **.

Ensuite, installez un module appelé ** folium ** pour vérifier la zone cible définie sur la carte.

!pip install folium

import folium

Maintenant que l'environnement est prêt, prenez l'image satellite de GEE.

2.2 Définition de la zone d'intérêt (zone cible)

Afin d'acquérir des images satellite de GEE, vous devez entrer les informations de latitude / longitude de la zone cible qui vous intéresse. Cette fois également, nous l'obtiendrons en utilisant le site suivant créé pour vérifier et obtenir facilement la ** latitude et longitude ** de la zone d'intérêt.

#Acquisition des informations polygonales de la zone d'intérêt.
from IPython.display import HTML
HTML(r'<iframe width="1000" height="580" src="https://gispolygon.herokuapp.com/" frameborder="0"></iframe>')

Lorsque vous exécutez cela, l'écran suivant s'affiche.

Screenshot from 2020-08-16 11-17-18.png

Après avoir élargi la zone d'intérêt, sélectionnez le polygone carré dans l'icône de gauche pour afficher le polygone de la zone d'intérêt. Après cela, cliquez sur ** Afficher les entités ** pour afficher les informations géographiques du polygone dans la fenêtre de droite. Cliquez ensuite sur ** Copier ** en bas pour copier ces informations géographiques. Cette fois, nous allons acquérir des images satellites de ** la zone est de Portland ** dans l'Oregon, aux États-Unis.

Screenshot from 2020-10-02 18-46-16.png

Collez ensuite les informations cartographiques copiées ci-dessous et entrez-les.

A  = {"type":"FeatureCollection","features":[{"properties":{"note":"","distance":"210025.76 m","drawtype":"rectangle","area":"520197.34 ha"},"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-122.60860204696657,44.80966973731369],[-122.60860204696657,45.400920907537866],[-121.60266637802125,45.400920907537866],[-121.60266637802125,44.80966973731369],[-122.60860204696657,44.80966973731369]]]}}]}

Ces informations géographiques sont traitées dans le format d'entrée pour GEE et pour l'affichage dans Folium.

#Définissez n'importe quel nom de fichier à utiliser ultérieurement. Par exemple, le nom de la zone.
object_name = 'Portland'
with open(str(object_name) +'_2.geojson', 'w') as f:
    json.dump(A, f)

json_file = open(str(object_name) +'_2.geojson')
json_object = json.load(json_file)

#Seules les informations de latitude / longitude de la zone d'intérêt sont extraites de json.
AREA = json_object["features"][0]["geometry"]['coordinates'][0]

Maintenant, vérifions la zone d'intérêt définie.

m = folium.Map([(AREA[0][1]+AREA[len(AREA)-2][1])/2,(AREA[0][0]+AREA[len(AREA)-3][0])/2], zoom_start=9)

folium.GeoJson(str(object_name) +'_2.geojson').add_to(m)
m

production

Screenshot from 2020-10-02 18-55-56.png

2.3 Acquisition d'images satellites de GEE

De nombreuses images satellites et de nombreuses informations déjà analysées sont définies dans GEE. Pour plus de détails, veuillez consulter Data Catalog. Sentinel-1 et 2 sont les suivants.

Sentinel-2 MSI: MultiSpectral Instrument, Level-1C

À partir de cette page, vous pouvez utiliser les données de ** Image d'observation Sentinel-2 du 23 juin 2015 **.

Maintenant, récupérez l'image de Sentinel-2 de GEE et enregistrez-la dans le colaboratoire Google.

Tout d'abord, préparez le format des informations géographiques à définir dans GEE.

region=ee.Geometry.Polygon(AREA)

Ensuite, définissez les paramètres des informations à acquérir. Cette fois, la période de l'image acquise et la destination de sauvegarde de l'image acquise sont spécifiées. Cette fois, nous avons confirmé que nous observions la zone le 9 septembre, nous avons donc fixé la période pour acquérir uniquement cette image.

#Précisez la période
from_date='2020-09-08'
to_date='2020-09-10'

#Nom du dossier à enregistrer
dir_name_s2 = 'GEE_Sentinel2_' + object_name

Maintenant, définissons les conditions d'image pour Sentinel-2.

def ImageExport(image,description,folder,region,scale):
    task = ee.batch.Export.image.toDrive(image=image,description=description,folder=folder,region=region,scale=scale)
    task.start()

Sentinel2 = ee.ImageCollection('COPERNICUS/S2').filterBounds(region).filterDate(parse(from_date),parse(to_date)).filterMetadata('CLOUDY_PIXEL_PERCENTAGE','less_than', 80).select(['B12','B11','B8A'])

imageList_s2 = Sentinel2.toList(300) 

Ici, nous avons décidé d'acquérir les images composites couleur de ** B12 **, ** B11 ** et ** B8A ** qui sont utilisées pour la composition des couleurs parmi les images d'observation de Sentinel-2. De plus, s'il est possible de filtrer la proportion de nuages dans l'image de Sentinel-2, elle est fixée à 80%, ce qui est plus élevé que d'habitude, afin d'éviter une reconnaissance erronée de la fumée du feu comme des nuages. Maintenant, dans les conditions d'acquisition d'image satellite ci-dessus, l'image de la zone d'intérêt de Sentinel-2 est acquise.

for i in range(imageList_s2.size().getInfo()):
    image = ee.Image(imageList_s2.get(i))
    ImageExport(image.reproject(crs='EPSG:4326',scale=10),image.get('system:index').getInfo(),dir_name_s2,region['coordinates'][0],10)

2.4 Affichage des images satellite

Affichez et confirmez l'image satellite acquise. Les images satellites sont enregistrées dans le répertoire (dossier) défini dans mon lecteur de Google Drive. Appelez-le et affichez-le.

#Visualisation par ordre chronologique
s2_path = '/content/drive/My Drive/' + dir_name_s2 + '/'
files =os.listdir(s2_path)
files.sort()

plt.figure(figsize=(25, 25))
j=0

v = len(files)//5 +1 
for i in range(len(files)):
  #Acquérir et visualiser des images une scène à la fois
  with rasterio.open(s2_path + files[i]) as src:
      arr = src.read()
  j+=1#Décaler et placer la position de tracé de l'image
  plt.subplot(v,5,j)
  arrayImg = np.asarray(arr).transpose(1,2,0).astype(np.float16)/10000
  plt.imshow(arrayImg)
  plt.title(files[i][0:8])#Obtenir la date à partir du nom du fichier
  plt.tight_layout()

Screenshot from 2020-10-02 19-02-04.png Nous avons acquis quatre images de la région. La raison pour laquelle il est divisé en quatre est que Sentinel-2 est enregistré en divisant l'image en 100 km carrés, et cette zone d'intérêt contient les quatre images divisées. En synthétisant les première et deuxième images, la zone d'intérêt est couverte, alors créez une ** image composite ** de ces deux images. Tout d'abord, vérifiez chaque image.

#Vérifiez l'image
s2_path = '/content/drive/My Drive/' + dir_name_s2 + '/'
files =os.listdir(s2_path)
files.sort()

#Lire les données
n = 0

with rasterio.open(s2_path + files[n]) as src:
    arr = src.read()

print(files[n][0:8])
#Visualisation
arrayImg0 = np.asarray(arr).transpose(1,2,0).astype(np.float16)/10000
plt.imshow(arrayImg0)
#Vérifiez l'image
s2_path = '/content/drive/My Drive/' + dir_name_s2 + '/'
files =os.listdir(s2_path)
files.sort()

#Lire les données
n = 1

with rasterio.open(s2_path + files[n]) as src:
    arr = src.read()

print(files[n][0:8])
#Visualisation
arrayImg1 = np.asarray(arr).transpose(1,2,0).astype(np.float16)/10000
plt.imshow(arrayImg1)

Ensuite, combinez ces deux images. ** (Mise à jour) ** Je pense qu'il existe plusieurs façons de combiner des images, mais j'avais l'habitude de les combiner avec numpy auparavant, mais je les combinerai avec la commande de fusion de rasterio qui a été conseillée dans les commentaires.

import rasterio.merge

dest, out_transform = rasterio.merge.merge([s2_path + files[0], s2_path + files[1]])

L'image composite est convertie par la fonction de transposition en raison de l'ordre du canal RVB, vertical, horizontal.

image = dest/10000

img_transformed = image.transpose((1, 2, 0))
img_transformed.shape

production

(6596, 11199, 3)

Sortez l'image.

plt.imshow(img_transformed)

Screenshot from 2020-10-03 16-57-14.png

Vous pouvez bien le synthétiser. (Avant la mise à jour, il y avait une partie noire au niveau de l'articulation.) Maintenant, enregistrez cette image composite au format jpeg.

import cv2

new_image = ((img_transformed - img_transformed.min()) * (1/(img_transformed.max() - img_transformed.min()) * 255)).astype('uint8')


im_rgb = cv2.cvtColor(new_image, cv2.COLOR_BGR2RGB)
cv2.imwrite(str(object_name) +'.jpg', im_rgb )

img = Image.open(str(object_name) +'.jpg')

plt.figure(figsize=(15, 20))

plt.imshow(img)
plt.show()

Ensuite, je mettrai la date d'imagerie du satellite artificiel et le crédit de l'image sur cette image.

2.5 Entrez la date et les crédits d'imagerie sur l'image satellite.

Ensuite, la date de prise de vue et le crédit de l'image satellite sont décrits dans cette image. La police utilisée ici est celle qui est ouverte au public gratuitement sur le net. C'est aussi votre préféré.

#Téléchargez et configurez les fichiers de polices
!wget https://osdn.net/dl/mplus-fonts/mplus-TESTFLIGHT-063a.tar.xz

!xz -dc mplus-TESTFLIGHT-*.tar.xz | tar xf -

fontfile = "./mplus-TESTFLIGHT-063a/mplus-1c-bold.ttf"

Maintenant, écrivez les caractères sur l'image.

date = files[n][0:8]

img = Image.open(str(object_name) +'.jpg')

img = img.convert('RGB')

x = int(img.size[0]/1.3) #Réglage de la position de la description de la date
y = int(img.size[1]/20) #Réglage de la position de la description de la date
fs = int(img.size[0]/70) #Définition de la taille de la police pour la date

obj_draw = ImageDraw.Draw(img)
obj_font = ImageFont.truetype(fontfile, fs)
obj_draw.text((x, y), 'Observation Date: '+str(date), fill=(255, 255, 255), font=obj_font)
obj_draw.text((img.size[0]/1.6, img.size[1]-y*0.1 - img.size[1]/30 ), 'Contains modified Copernicus Sentinel data (2020)', fill=(255, 255, 255), font=obj_font)

img = img.resize((int(img.size[0] / 2) , int(img.size[1] / 2)))

img.save(str(object_name) +'.jpg')

plt.figure(figsize=(15, 20))

plt.imshow(img)
plt.show()

Screenshot from 2020-10-03 16-59-15.png

Vous avez maintenant les informations nécessaires sur l'image. Modifiez le code ci-dessus pour ajuster la position, la taille, la couleur, etc. des caractères à votre guise. Le fichier image créé peut être téléchargé sur votre PC en cliquant avec le bouton droit sur le nom du fichier cible dans la liste des fichiers à gauche et en sélectionnant ** Télécharger **.

3. Enfin

À l'aide de ** Google Earth Engine ** fourni par Google, nous avons présenté comment acquérir des images satellite de ** Sentinel-2 ** et traiter des images de ** feu de forêt ** sur la côte ouest des États-Unis à titre d'exemple d'analyse. .. Les incendies de forêt sont toujours en cours et d'importants dégâts ont été signalés. Je prie pour que les activités des pompiers soient fructueuses et qu’ils reviennent bientôt à leur vie normale. Si vous avez des commentaires ou des questions, n'hésitez pas à commenter. Je suis heureux.

Article de référence

Comment obtenir gratuitement les dernières images satellite. J'ai essayé d'acquérir automatiquement l'image d'observation du satellite artificiel (Sentinel-2) en utilisant l'API. Créer une carte de distribution estimée des voitures à partir d'images satellites artificielles de PyTorch. J'ai vérifié l'état d'utilisation du parking à partir d'images satellite. J'ai fait un laps de temps d'images satellites des incendies de forêt australiens.

[Sequel] Analyse d'images satellitaires artificielles par Google Earth Engine et Google Colab-Analyse d'images satellite commençant gratuitement (pratique) - Analyse d'images satellites artificielles par Google Earth Engine et Google Colab-Analyse d'images satellite à partir de gratuitement (Introduction) - [6. Exécution GEE locale par Python](https://sites.google.com/site/mizuochipublic/%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3 % E3% 83% 86% E3% 83% B3% E3% 83% 84-tutoriels-de-télédétection / moteur-google-earth% E5% 85% A5% E9% 96% 80/6-python% E3% 81 % AB% E3% 82% 88% E3% 82% 8B% E3% 83% AD% E3% 83% BC% E3% 82% AB% E3% 83% AB% E3% 81% 8B% E3% 82% 89 % E3% 81% AEgee% E5% AE% 9F% E8% A1% 8C)

Kihon de données satellitaires - Compréhension, type, fréquence, résolution, cas d'utilisation ~ Pouvez-vous voir des gens depuis le satellite artificiel? ~ Par satellite, résolution au sol / résumé de l'heure locale ~

Sentinel-2 MSI: MultiSpectral Instrument, Level-1C

Recommended Posts

Jetons un coup d'œil à l'incendie de forêt sur la côte ouest des États-Unis avec des images satellites.
Jetons un coup d'œil à la carte des fonctionnalités de YOLO v3
Jetons un coup d'œil au code Scapy. Surcharge des méthodes spéciales __div__, __getitem__.
Jetons un coup d'œil au code Scapy. Comment traitez-vous la structure?
Jetez un œil au traitement de LightGBM Tuner
Prenez des captures d'écran LCD avec Python-LEGO Mindstorms
Jetez un œil au profilage et au vidage avec Dataflow
Regardez de plus près le tutoriel Kaggle / Titanic
Challenge classification des images par TensorFlow2 + Keras 2 ~ Regardons de plus près les données d'entrée ~
Mesurer l'importance des entités avec un outil de forêt aléatoire
Obtenez UNIXTIME au début d'aujourd'hui avec une commande
Exécutons la commande à temps avec le bot discord
Jetez un œil à l'arborescence des exceptions intégrée à Python
Jetons un coup d'œil à la tendance infectieuse du nouveau coronavirus COVID-19 dans chaque pays et à l'état de la réponse médicale (informations supplémentaires).
Jetez un œil à l'arborescence des exceptions intégrée dans Python 3.8.2
Jetez un œil au modèle Django.
Résumez le titre de Hottentori dans Hateb et regardez le présent du Web