À partir de l'image satellite obtenue du précédent moteur Google Earth Engine, nous avons calculé la transition du nombre de voitures dans le parking de Tokyo Disneyland.
J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.
Cette fois-ci, comme la fois précédente, nous obtiendrons des images satellites de Google Earth Engine et trouverons l'évolution du nombre de navires dans la baie de Tokyo.
Il s'agit d'un décompte des navires sur les images prises par le satellite artificiel près de l'entrée de la baie de Tokyo, et la tendance est calculée. Je vais l'introduire dans cet article en incluant l'explication de ce graphique. 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 **.
La dernière fois, nous avons calculé le nombre de voitures dans le parking de Tokyo Disneyland en utilisant l'image du capteur d'ondes radio (SAR) dans l'image satellite.
J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.
Il est difficile d'identifier le type de véhicule tel qu'une voiture ou un camion dans l'image SAR, mais il peut être évalué qualitativement si un grand nombre de voitures sont garées sur le parking et qu'il n'est pas affecté par les nuages. Par conséquent, il peut être évalué de manière stable. Par conséquent, nous utiliserons à nouveau l'image SAR pour trouver le nombre de navires à partir de l'image satellite près de l'entrée de la baie de Tokyo. C'est parce que je pensais qu'il serait possible d'évaluer comment le nombre de navires a changé en raison de l'influence du nouveau virus corona, s'il n'a pas changé et dans quelle mesure il a changé. Je pense que ce site sera utile pour savoir à quoi ressemble le navire dans l'image SAR.
Cette image capturée du Daichi n ° 2 est une image en mode observation avec une résolution de 3 m, et si vous êtes un gros navire, vous pouvez voir sa forme. Le point important ici est que le navire semble brillant et la mer environnante semble sombre. Le satellite SAR irradie la Terre avec des ondes radio et des images de l'intensité du signal réfléchi. À ce moment, ** les ondes radio sont émises depuis une direction oblique par rapport à la surface du sol **, donc si la surface du sol est plane, beaucoup de choses se reflètent dans la direction incidente des ondes radio, c'est-à-dire dans la direction opposée au satellite qui reçoit les ondes radio émises. Faire. Par conséquent, ** Si la surface au sol cible est plate, le signal reçu est faible et l'image sera sombre. La surface de l'eau des lacs et de la mer est extrêmement plate, elle semble donc plus sombre **. Par contre, lorsqu'il y a une structure telle qu'un bâtiment, un bâtiment, une voiture ou un bateau, l'objet est inégal, donc plus d'ondes radio sont réfléchies dans la même direction que la direction incidente, donc l'image est lumineuse. Comptons le nombre de navires dans l'image satellite, en utilisant cette ** partie brillamment réfléchie ** comme un navire.
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.
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 trouver et obtenir facilement la latitude et la 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.
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 cette zone près de l'entrée de la baie de Tokyo.
Collez ensuite les informations cartographiques copiées ci-dessous et entrez-les.
A = {"type":"FeatureCollection","features":[{"properties":{"note":"","distance":"35937.06 m","drawtype":"rectangle","area":"12713.15 ha"},"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[139.71197873353958,35.33475055335104],[139.71197873353958,35.452996930987666],[139.81840878725052,35.452996930987666],[139.81840878725052,35.33475055335104],[139.71197873353958,35.33475055335104]]]}}]}
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 = 'tokyobay3'
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=15)
folium.GeoJson(str(object_name) +'_2.geojson').add_to(m)
m
production
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-1 SAR GRD: C-band Synthetic Aperture Radar Ground Range Detected, log scaling
À partir de cette page, vous pouvez utiliser les données de ** Image d'observation Sentinel-1 du 3 octobre 2014 **.
Maintenant, récupérez l'image de Sentinel-1 de GEE et enregistrez-la dans Google colaboratory.
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.
#Précisez la période
from_date='2019-01-01'
to_date='2020-08-31'
#Nom du dossier à enregistrer
dir_name_s1 = 'GEE_Sentinel1_' + object_name
Maintenant, définissons les conditions d'image pour Sentinel-1.
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()
Sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD').filterBounds(region).filterDate(parse(from_date),parse(to_date)).filter(ee.Filter.eq('orbitProperties_pass', 'ASCENDING')).select(['VV'])
imageList_s1 = Sentinel1.toList(300)
Ici, comme l'image d'observation de Sentinel-1 n'utilise que l'image d'observation du satellite B à 18h00, «ASCENDING» est sélectionné dans «orbitProperties_pass». Si vous le réglez sur "Décroissant", l'image d'observation sera à 6h00.
Maintenant, dans les conditions d'acquisition d'image satellite ci-dessus, l'image de la zone d'intérêt de Sentinel-1 est acquise.
for i in range(imageList_s1.size().getInfo()):
image = ee.Image(imageList_s1.get(i))
ImageExport(image.reproject(crs='EPSG:4326',scale=10),image.get('system:index').getInfo(),dir_name_s1,region['coordinates'][0],10)
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
s1_path = '/content/drive/My Drive/' + dir_name_s1 + '/'
files =os.listdir(s1_path)
files.sort()
plt.figure(figsize=(20, 40))
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(s1_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)
plt.imshow(arr[0], cmap='gray')
plt.title(files[i][33:41])#Obtenir la date à partir du nom du fichier
plt.tight_layout()
L'image observée du satellite SAR est une image en noir et blanc, et la partie brillante de cette image semble être un navire. Ensuite, comptez le nombre de parties lumineuses de l'image en tant que navires.
#Lire les données
n = 2
with rasterio.open(s1_path + files[n]) as src:
arr = src.read()
print(files[n][33:41])
#Visualisation
plt.imshow(arr[0], cmap='gray')
Lorsque j'ai agrandi l'image satellite, il a été confirmé qu'il y avait de nombreux points lumineux. Maintenant, trouvons la distribution d'intensité de cette image.
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(arr[0], bins=50)
fig.show()
L'intensité du signal est souvent de 0 ou moins, mais certains signaux de 0 ou plus ont également été observés. À partir de cette condition, le processus de binarisation est effectué en premier avec 0 ou plus et moins de 0.
Pour la méthode de comptage des objets dans l'image, je me suis référé au site suivant.
Cette méthode effectue une binarisation avec une force de signal arbitraire, trouve la position centrale s'il y a un écart, vérifie si la position centrale est le même objet ou non dans une fenêtre arbitraire et détermine le nombre d'objets. Compter. Ensuite, je présenterai la méthode concrètement. Tout d'abord, l'image échantillon était la dernière image capturée dans l'image acquise.
#Lire les données
n = len(files) -1
with rasterio.open(s1_path + files[n]) as src:
arr = src.read()
print(files[n][33:41])
#Visualisation
plt.imshow(arr[0], cmap='gray')
Vous pouvez voir qu'il y a de nombreux points lumineux. Ensuite, le traitement de binarisation est effectué. Ici, le processus de binarisation est effectué avec 0 ou plus et moins de 0 en référence à la distribution d'intensité du signal ci-dessus. De plus, une carte de la position centrale est créée à partir de l'image binarisée obtenue.
#Processus de binarisation
import cv2
binimg = (arr[0]>0) #Définissez 0 comme seuil.
plt.imshow(binimg)
plt.colorbar()
plt.show()
#Carte de distance(distance map)Calculer
binimg = binimg.astype(np.uint8)
distmap = cv2.distanceTransform(binimg,1,3)
plt.imshow(distmap)
plt.colorbar()
plt.show()
Agrandir la partie où de nombreux navires ont été imagés.
plt.imshow(distmap[0:200,0:200])
plt.colorbar()
plt.show()
Vous pouvez voir que le signal qui semble être un navire s'étend dans une certaine direction. Ensuite, obtenez la distribution avec la force maximale du signal à partir de cette image. À cette époque, la taille du navire était fixée à 30 pixels. En d'autres termes, nous définissons qu'il n'y a qu'un seul vaisseau en 30 pixels.
#Calculez l'emplacement avec la valeur maximale de la carte de distance
out = distmap*0
ksize=30 #Valeur maximale à moins de 30 pixels
for x in range(ksize,distmap.shape[0]-ksize*2):
for y in range(ksize,distmap.shape[1]-ksize*2):
if distmap[x,y]>0 and distmap[x,y]==np.max(distmap[x-ksize:x+ksize,y-ksize:y+ksize]):
out[x,y]=1
plt.imshow(distmap[0:200,0:200])
plt.colorbar()
plt.show()
Ensuite, si la force du signal est élevée à un pixel près de la position qui semble être un navire, il peut être faussement détecté, donc s'il se trouve dans une certaine plage, il sera ignoré.
#Gonfler, détecter et compter les contours
out = cv2.dilate(out,(10,10)) #10*Gonflez à 10 et ne comptez pas si dans la même plage
contours, _ = cv2.findContours(out.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
arr=[]
for i in contours:
x_=0
y_=0
for j in i:
x_ += j[0][0]
y_ += j[0][1]
arr.append([x_/len(i), y_/len(i)])
arr = np.array(arr)
plt.imshow(distmap[0:200,0:200])
plt.colorbar()
plt.show()
print("Nombre de navires: ", len(arr))
print(arr)
Ici, le nombre de navires et leurs positions sont affichés. En utilisant cette méthode, le nombre de navires est calculé à partir de l'image satellite acquise et la transition est représentée graphiquement.
#Graphique chronologique du nombre estimé de navires dans la zone
#Visualisation par ordre chronologique
s1_path = '/content/drive/My Drive/' + dir_name_s1 + '/'
files =os.listdir(s1_path)
files.sort()
sum_ship = []
label_signal = []
for i in range(len(files)):
label_signal.append(files[i][33:41])
#Acquérir et visualiser des images une scène à la fois
with rasterio.open(s1_path + files[i]) as src:
arr = src.read()
#Processus de binarisation
binimg = (arr[0]>0)
#Carte de distance(distance map)Calculer
binimg = binimg.astype(np.uint8)
distmap = cv2.distanceTransform(binimg,1,3)
out = distmap*0
ksize=30 #Valeur maximale à moins de 30 pixels
for x in range(ksize,distmap.shape[0]-ksize*2):
for y in range(ksize,distmap.shape[1]-ksize*2):
if distmap[x,y]>0 and distmap[x,y]==np.max(distmap[x-ksize:x+ksize,y-ksize:y+ksize]):
out[x,y]=1
out = cv2.dilate(out,(10,10)) #10*Gonflez à 10 et ne comptez pas si dans la même plage
contours, _ = cv2.findContours(out.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
num=[]
for i in contours:
x_=0
y_=0
for j in i:
x_ += j[0][0]
y_ += j[0][1]
num.append([x_/len(i), y_/len(i)])
num = np.array(num)
sum_ship.append(len(num))
#Visualisation
fig,ax = plt.subplots(figsize=(15,6))
plt.plot(sum_ship, marker='o')
ax.set_xticks(np.arange(0,len(files)))
ax.set_xticklabels(label_signal, rotation=90)
plt.show()
L'axe horizontal est la date d'observation et l'axe vertical est le nombre de navires calculé à partir de l'image d'observation. Il atteindra sa valeur maximale vers mars 2019, mais après cela, ce sera environ 30 navires en moyenne. Je me demandais si le mouvement par bateau avait été restreint ou diminué lors de la catastrophe de Corona après mars 2020, mais pour autant que je sache, il semble que le nombre de parkings à Tokyo Tisneyland ait considérablement diminué. ne pas. En fait, j'ai cherché sur Internet pour voir combien de navires naviguaient dans la baie de Tokyo, et j'ai trouvé un article sur les navires de croisière qui s'abstiennent d'opérer, mais de nombreux autres navires sont en déclin. Il n'y avait rien. Je pense que même à Corona, tout le monde faisait attention à la sécurité afin de stabiliser la distribution. Je vous remercie. J'ai essayé d'enquêter sur les endroits où de nombreux navires naviguent autres que la baie de Tokyo par la même méthode, mais il n'y a pas de tendance à ce que le nombre de coronas soit extrêmement réduit même s'il s'agit d'un dommage corona comme cette fois, et les personnes qui exploitent des navires Grâce à mes efforts, j'ai réalisé qu'une distribution stable était maintenue.
Nous avons présenté comment calculer le nombre de navires dans la baie de Tokyo comme exemple d'acquisition et d'analyse d'images satellite à l'aide du moteur Google Earth fourni par Google. J'espère que ce sera l'occasion pour plus de gens de s'intéresser aux images satellites. Si vous avez des commentaires ou des questions, n'hésitez pas à commenter. Je suis heureux.
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.
[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-1 SAR GRD: C-band Synthetic Aperture Radar Ground Range Detected, log scaling
Recommended Posts