宙畑 Sorabatake

衛星データ

【ゼロからのTellusの使い方】Jupyter NotebookでAVNIR-2/ALOSによる光学画像を取得する

ALOSに搭載された光学センサ「AVNIR-2/ALOS」によるの光学画像を、Tellus上のJupyter Notebookを使って取得する方法をご紹介します。

Tellusは、さくらインターネット株式会社が経済産業省から受託した、政府衛星データのオープン&フリー化及びデータ利用環境整備事業における衛星データプラットフォームのことで、登録するとブラウザから様々な衛星データを利用することができます。

本記事ではTellusのJupyter Notebookを使ってAVNIR-2/ALOSによる光学画像を取得する方法を紹介します。

TellusでJupyter Nootbookを使う方法は、「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。

(1) まずはAPIを使ってみよう

AVNIR-2とはALOS(JAXAの陸域観測技術衛星だいち)に搭載された光学センサのことで、可視光領域から近赤外領域にかけての波長で地上を観測していました(2011年に運用停止)。

そんなAVNIR-2が取得した光学画像をTellusでも利用することができるので、実際にJupyter Notebook上で表示してみましょう。

APIでAVNIR-2の画像を取得するには、ズーム率とタイル座標、その他パラメータを設定する必要があります。

https://gisapi.tellusxdp.com/blend/{z}/{x}/{y}.png?opacity={opacity}&r={r}&g={g}&b={b}&rdepth={rdepth}&gdepth={gdepth}&bdepth={bdepth}&preset={preset}
z 必須 Zoom Level 0-13
x 必須 タイルのX座標
y 必須 タイルのY座標
opacity 任意 透過度 0~1
r 任意 カラーのバンド指定 1,2,3,4
デフォルト:3
g 任意 カラーのバンド指定 1,2,3,4
デフォルト:2
b 任意 カラーのバンド指定 1,2,3,4
デフォルト:1
rdepth 任意 カラーバンドの濃さ 0~2
デフォルト:1
gdepth 任意 カラーバンドの濃さ 0~2
デフォルト:1
bdepth 任意 カラーバンドの濃さ 0~2
デフォルト:1
preset 任意 true / false / natural / ndvi

まずは複雑なことは考えず、Pythonのサンプルコードをそのまま実行してみましょう。

import os, json, requests, math
from skimage import io
from io import BytesIO
import matplotlib.pyplot as plt
%matplotlib inline

TOKEN = "ここには自分のアカウントのトークンを貼り付ける"

def get_AVNIR_image(zoom, xtile, ytile, opacity=1, r=3, g=2, b=1, rdepth=1, gdepth=1, bdepth=1, preset=None):
    url = "https://gisapi.tellusxdp.com/blend/{}/{}/{}.png?opacity={}&r={}&g={}&b={}&rdepth={}&gdepth={}&bdepth={}".format(zoom, xtile, ytile, opacity, r, g, b, rdepth, gdepth, bdepth) 
    if preset is not None:
        url += '&preset='+preset
    headers = {
        "content-type": "application/json",
        "Authorization": "Bearer " + TOKEN
    }
    
    r = requests.get(url, headers=headers)
    return io.imread(BytesIO(r.content))

img = get_AVNIR_image(10,909,403)
io.imshow(img)

トークンはマイページのAPIアクセス設定(要ログイン)から取得してください。
エラーが出なければ、東京の築地周辺の光学画像が表示されます。画像中央の緑の箇所は浜離宮恩賜庭園です。

築地周辺の光学画像が取得できます
都会のオアシス浜離宮恩賜庭園
緑に囲まれた大きな池の向こうに東京タワーを臨むことができます。 Credit : sorabatake

(2) skimageにおけるpng画像のデータ構造

APIで取得できる画像はpng形式です。

各ピクセルにはRGBとアルファ値(透明度)の色情報が収められています(画像によってはアルファ値がない場合もあります)。

print(img[0,0])

出力

[ 55  68  93 255]

これは取得した画像の一番左上のピクセルの色情報です。値はそれぞれ[赤、緑、青、アルファ値]を意味しており、0から255の範囲で表現されます。

※今回はscikit-imageというPythonの画像処理ライブラリを利用していますが、ライブラリによっては色がこの順番とは限りません。例えばOpenCVでは青、緑、赤、アルファ値の順になります。

色情報サンプル Credit : sorabatake

(3) AVNIR-2のカラーバンド

AVNIR-2は4つのバンド(波長帯)を持つセンサーです。

Band1 0.42 ~ 0.50µm
Band2 0.52 ~ 0.60µm
Band3 0.61 ~ 0.69µm
Band4 0.76 ~ 0.89µm

Band1を青、Band2を緑、Band3を赤として合成すると、先程取得したような、人間が普段感じるのに近い色合いの画像となります。

AVNIR-2のBand4は近赤外領域の波長です。そして植物の葉は近赤外線領域の波長を強く反射します。

この性質を利用して観測範囲の植物をより目立たせるNatural Colorという合成方法があります。

Natural Colorでは、青にBand1、緑にBand2、赤にBand3を割り当てて合成します。

青にBand1、緑にBand2、赤にBand3を割り当てる合成方法はTrue Colorと呼ばれています。

img_natural = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,r=3,g=4,b=2)
io.imshow(np.hstack((img, img_natural)))
左がTrue Color合成、右がNatural Color合成

右側の画像がNatural Color合成によるものです。全体的に赤みがかって見えますが、その中で画像中央の浜離宮恩賜庭園が緑に浮き上がっているのがわかるでしょうか。この緑に浮き上がっている部分が植物というわけです。

(4) presetを使おう

このようにAVNIR-2のAPIは引数を変えることで様々な合成方法を選択することが可能です。

Tellusでは、このような代表的な合成方法にはプリセット(preset)が用意されています。実は今回取得したNatural Colorもpresetにnaturalと指定するだけで取得できてしまいます。

img_natural_preset = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,preset="natural")
io.imshow(img_natural_preset)
プリセットにより取得したNatural Color合成の画像

以上が、TellusのJupyter Notebookを使ってAVNIR-2/ALOSによる光学画像を取得する方法でした。

AVNIR-2のデータはバンドごとに分かれているため、様々な合成方法を選択することができます。

目的に応じて最適な合成方法の画像を取得して分析に役立ててください。