AVNIR-2/ALOSの光学画像を取得

Tag

AVNIR-2のAPIを使用する

Tellusでは、ALOS(JAXAの陸域観測技術衛星だいち)に搭載された光学センサであるAVNIR-2が取得した画像を利用することができます。AVNIR-2は、2006年から可視光領域から近赤外領域にかけての波長で地上を観測していました(2011年に運用停止)。 実際にJupyterLab上で表示してみましょう。APIでAVNIR-2の画像を取得するには、ズーム率とタイル座標、その他パラメータを設定する必要があります。 APIの使い方はリファレンスにまとめられています。 ※画像を利用する際は、利用ポリシーを確認して、規約を違反しないように注意してください。

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}


devAvnir_api1_20200220_table1.png

import os, json, requests, math
import numpy as np
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 = {
        "Authorization": "Bearer " + TOKEN
    }
    r = requests.get(url, headers=headers)
    return io.imread(BytesIO(r.content))
Z = 13
X = 7276
Y = 3226
img = get_AVNIR_image(Z,X,Y)
io.imshow(img)

devAvnir_api1_20200220_7.png

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

devAvnir_api1_20200220_2.png

Credit:Original data provided by JAXA

築地周辺の光学画像が取得できます。 devAvnir_api1_20200220_4.jpg

都会のオアシス浜離宮恩賜庭園。緑に囲まれた大きな池の向こうに東京タワーを臨むことができます。Credit : SAKURA Internet Inc.

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

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

print(img[0,0])

出力

[ 55 68 93 255]

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

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

devAvnir_api1_20200220_8.png

色情報サンプル Credit : SAKURA Internet Inc.

AVNIR-2のカラーバンド

AVNIR-2は4つのバンド(波長帯)で観測するセンサーです。 devAvnir_api1_20200220_table2.png AVNIR-2のBand4は近赤外領域の波長です。植物の葉は近赤外線領域の波長を強く反射します。この性質を利用して観測範囲の植物をより目立たせるNatural colorという合成方法があります。Natural colorでは、赤(r)にBand3、緑(g)にBand4、青(b)にBand2を割り当てて合成します。 ※赤(r)にBand3、緑(g)にBand2、青(b)にBand1を割り当てる合成方法は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)))

devAvnir_api1_20200220_6.png

Credit:Original data provided by JAXA 左がTrue color合成、右がNatural color合成

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

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)

devAvnir_api1_20200220_3.png

Credit:Original data provided by JAXA プリセットにより取得したNatural color合成の画像。
img_false_preset = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,preset="false")
io.imshow(img_false_preset)

devAvnir_api1_20200220_5.png

Credit:Original data provided by JAXA プリセットにより取得したFalse color合成の画像
img_ndvi_preset = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,preset="ndvi")
io.imshow(img_ndvi_preset)

devAvnir_api1_20200220_1.png

Credit:Original data provided by JAXA プリセットにより取得したNDVI合成の画像 。

以上が、TellusのJupyterLabを使ってAVNIR-2/ALOSによる光学画像を取得する方法でした。AVNIR-2のデータはバンドごとに分かれているため、様々な合成方法を選択することができます。 目的に適した合成方法の画像を取得して分析に役立ててください。 今回使用したスクリプトです。

import os, json, requests, math
import numpy as np
from skimage import io
from io import BytesIO
import matplotlib.pyplot as plt
get_ipython().run_line_magic('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 = {
            "Authorization": "Bearer " + TOKEN
	}
	r = requests.get(url, headers=headers)
	return io.imread(BytesIO(r.content))
Z = 13
X = 7276
Y = 3226
img = get_AVNIR_image(Z,X,Y)
io.imshow(img)
print(img[0,0])
img_natural = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,r=3,g=4,b=2)
io.imshow(np.hstack((img, img_natural)))
img_natural_preset = get_AVNIR_image(zoom=Z,xtile=X,ytile=Y,preset="natural")
io.imshow(img_natural_preset)