🛰️

光学衛星の大気補正とその実装

2024/05/04に公開

大気補正とは

大気補正 とは、人工衛星が地上観測を行う時に受ける大気の影響を補正する処理の総称です。
衛星の高次処理の1つで、データ処理レベルでは、レベル2の処理とされることが多いです。

事前知識

光学衛星には、処理レベルという幾つかの補正やプロセスを踏みます。
その理由は、地上観測が1つの目的であるからです。
そのために地上の変化のみを上手に抽出して定点観測ができるように安定した物理量を得ることが重要視されます。

処理レベルは、0, 1, 2 と大きく分けて3つあります。
レベル2の処理の1つに大気補正があります。

大気補正をする理由

補正をする理由は名前の通り、大気 の影響をなくすことが目的です。

光学衛星は、地上から反射した太陽光を撮像したいです。しかし、人工衛星には地上だけではない太陽光からの反射が含まれています。その大きな要因が大気での光の散乱です。その影響を無くして、地上の反射だけにする処理が 大気補正になります。

大気補正が必要な状況

まずは、衛星運用側からの視点を中心に見ていきましょう。

異なる軌道

軌道が異なる場合は、撮像するオフナディア角度が変化すると共に、地上での入社角が変化します。
それによって大気の影響を受ける光の時間と距離が変化するからです。

異なる時期

地上観測する時期が異なる場合は、大気の状態な同じではないのでその影響が出てきます。
特に、季節の影響などは大きいです。

大気補正の原因

直接的な要因は、大気の温度、水分飽和量や大気の物質の差によって光の放射率、透過率などが変化することで太陽光が変化するからです。
化学と物理の物質同士の難しいお話になっていきます。。。。

では、大気の温度、水分と物質は何から変化するかというと、季節や天候、気流のような地球規模の変化がほとんどです。なので観測するタイミングでの大気の状態を別の方法で一緒に観測して補正する場合が多いです。


特に、ToA (Top of the Atmosphere): 大気上部の反射が強いです。
これを補正するようにシミュレーションしてその値を除くようなイメージです。

大気補正のパラメータ

根本的な原因が変化する衛星のパラメータは大きくは以下のようなものです。
他にも、太陽風などの宇宙天気や飛行機などの人工的な影響がありますが特殊なことなので割愛します。

波長


これは光の性質で、波長によって光の散乱具合が異なるからです。
レイリー散乱で夕日が赤くなることと同じです。
なので基本的にはバンドごとに異なる値で補正をかけるのが基本です。

散乱時間

光速は一定なので、散乱する時間が多ければ距離が多くなり、散乱する機会が増えて、大気の影響を多く受けるようになります。
単純に、大気を移動する時間が長いかどうかに影響されます。

標高

標高(DEM)によっても大気の濃さが異なったり、地上までの距離が異なるために電磁波の強さが変化します。

実装

実際に補正する場合のツールと実装をご紹介します。
一般的なものは以下のようなものを使用をお勧めします。

論文、文献調査するとわかりますが、観測対象によって最適な方法があったりするのでそれらに合わせて実装していくのが良いでしょう。

LandSat

LandSat のレベル1のプロダクトに大気補正のためのパラメータなどは事前に計算して提供されています。

サンプルデータは こちらを使用します。


このデータは無料で公開されています。

ダウンロード方法

AWS S3 での取得方法

aws s3 cp s3://usgs-landsat/collection02/level-1/standard/oli-tirs/2024/107/035/LC09_L1TP_107035_20240331_20240331_02_T1 ./ --recursive --request-payer requester

AWS CLI を使用しています。

パラメータのファイルは、*_T1_MTL.json です。

ファイルの中身
{
    "LANDSAT_METADATA_FILE": {
        "PRODUCT_CONTENTS": {
            "ORIGIN": "Image courtesy of the U.S. Geological Survey",
            "DIGITAL_OBJECT_IDENTIFIER": "https://doi.org/10.5066/P975CC9B",
            "LANDSAT_PRODUCT_ID": "LC09_L1TP_107035_20240331_20240331_02_T1",
            "PROCESSING_LEVEL": "L1TP",
            "COLLECTION_NUMBER": "02",
            "COLLECTION_CATEGORY": "T1",
            "OUTPUT_FORMAT": "GEOTIFF",
            "FILE_NAME_BAND_1": "LC09_L1TP_107035_20240331_20240331_02_T1_B1.TIF",
            "FILE_NAME_BAND_2": "LC09_L1TP_107035_20240331_20240331_02_T1_B2.TIF",
            "FILE_NAME_BAND_3": "LC09_L1TP_107035_20240331_20240331_02_T1_B3.TIF",
            "FILE_NAME_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_B4.TIF",
            "FILE_NAME_BAND_5": "LC09_L1TP_107035_20240331_20240331_02_T1_B5.TIF",
            "FILE_NAME_BAND_6": "LC09_L1TP_107035_20240331_20240331_02_T1_B6.TIF",
            "FILE_NAME_BAND_7": "LC09_L1TP_107035_20240331_20240331_02_T1_B7.TIF",
            "FILE_NAME_BAND_8": "LC09_L1TP_107035_20240331_20240331_02_T1_B8.TIF",
            "FILE_NAME_BAND_9": "LC09_L1TP_107035_20240331_20240331_02_T1_B9.TIF",
            "FILE_NAME_BAND_10": "LC09_L1TP_107035_20240331_20240331_02_T1_B10.TIF",
            "FILE_NAME_BAND_11": "LC09_L1TP_107035_20240331_20240331_02_T1_B11.TIF",
            "FILE_NAME_QUALITY_L1_PIXEL": "LC09_L1TP_107035_20240331_20240331_02_T1_QA_PIXEL.TIF",
            "FILE_NAME_QUALITY_L1_RADIOMETRIC_SATURATION": "LC09_L1TP_107035_20240331_20240331_02_T1_QA_RADSAT.TIF",
            "FILE_NAME_ANGLE_COEFFICIENT": "LC09_L1TP_107035_20240331_20240331_02_T1_ANG.txt",
            "FILE_NAME_ANGLE_SENSOR_AZIMUTH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_VAA.TIF",
            "FILE_NAME_ANGLE_SENSOR_ZENITH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_VZA.TIF",
            "FILE_NAME_ANGLE_SOLAR_AZIMUTH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_SAA.TIF",
            "FILE_NAME_ANGLE_SOLAR_ZENITH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_SZA.TIF",
            "FILE_NAME_METADATA_ODL": "LC09_L1TP_107035_20240331_20240331_02_T1_MTL.txt",
            "FILE_NAME_METADATA_XML": "LC09_L1TP_107035_20240331_20240331_02_T1_MTL.xml",
            "DATA_TYPE_BAND_1": "UINT16",
            "DATA_TYPE_BAND_2": "UINT16",
            "DATA_TYPE_BAND_3": "UINT16",
            "DATA_TYPE_BAND_4": "UINT16",
            "DATA_TYPE_BAND_5": "UINT16",
            "DATA_TYPE_BAND_6": "UINT16",
            "DATA_TYPE_BAND_7": "UINT16",
            "DATA_TYPE_BAND_8": "UINT16",
            "DATA_TYPE_BAND_9": "UINT16",
            "DATA_TYPE_BAND_10": "UINT16",
            "DATA_TYPE_BAND_11": "UINT16",
            "DATA_TYPE_QUALITY_L1_PIXEL": "UINT16",
            "DATA_TYPE_QUALITY_L1_RADIOMETRIC_SATURATION": "UINT16",
            "DATA_TYPE_ANGLE_SENSOR_AZIMUTH_BAND_4": "INT16",
            "DATA_TYPE_ANGLE_SENSOR_ZENITH_BAND_4": "INT16",
            "DATA_TYPE_ANGLE_SOLAR_AZIMUTH_BAND_4": "INT16",
            "DATA_TYPE_ANGLE_SOLAR_ZENITH_BAND_4": "INT16"
        },
        "IMAGE_ATTRIBUTES": {
            "SPACECRAFT_ID": "LANDSAT_9",
            "SENSOR_ID": "OLI_TIRS",
            "WRS_TYPE": "2",
            "WRS_PATH": "107",
            "WRS_ROW": "35",
            "NADIR_OFFNADIR": "NADIR",
            "TARGET_WRS_PATH": "107",
            "TARGET_WRS_ROW": "35",
            "DATE_ACQUIRED": "2024-03-31",
            "SCENE_CENTER_TIME": "01:15:50.4780630Z",
            "STATION_ID": "LGN",
            "CLOUD_COVER": "1.91",
            "CLOUD_COVER_LAND": "2.66",
            "IMAGE_QUALITY_OLI": "9",
            "IMAGE_QUALITY_TIRS": "9",
            "SATURATION_BAND_1": "Y",
            "SATURATION_BAND_2": "Y",
            "SATURATION_BAND_3": "Y",
            "SATURATION_BAND_4": "Y",
            "SATURATION_BAND_5": "Y",
            "SATURATION_BAND_6": "Y",
            "SATURATION_BAND_7": "Y",
            "SATURATION_BAND_8": "N",
            "SATURATION_BAND_9": "N",
            "ROLL_ANGLE": "-0.001",
            "SUN_AZIMUTH": "142.32720919",
            "SUN_ELEVATION": "52.32909743",
            "EARTH_SUN_DISTANCE": "0.9989679"
        },
        "PROJECTION_ATTRIBUTES": {
            "MAP_PROJECTION": "UTM",
            "DATUM": "WGS84",
            "ELLIPSOID": "WGS84",
            "UTM_ZONE": "54",
            "GRID_CELL_SIZE_PANCHROMATIC": "15.00",
            "GRID_CELL_SIZE_REFLECTIVE": "30.00",
            "GRID_CELL_SIZE_THERMAL": "30.00",
            "PANCHROMATIC_LINES": "15741",
            "PANCHROMATIC_SAMPLES": "15481",
            "REFLECTIVE_LINES": "7871",
            "REFLECTIVE_SAMPLES": "7741",
            "THERMAL_LINES": "7871",
            "THERMAL_SAMPLES": "7741",
            "ORIENTATION": "NORTH_UP",
            "CORNER_UL_LAT_PRODUCT": "37.08539",
            "CORNER_UL_LON_PRODUCT": "138.75659",
            "CORNER_UR_LAT_PRODUCT": "37.10604",
            "CORNER_UR_LON_PRODUCT": "141.36915",
            "CORNER_LL_LAT_PRODUCT": "34.95833",
            "CORNER_LL_LON_PRODUCT": "138.81612",
            "CORNER_LR_LAT_PRODUCT": "34.97744",
            "CORNER_LR_LON_PRODUCT": "141.35935",
            "CORNER_UL_PROJECTION_X_PRODUCT": "300600.000",
            "CORNER_UL_PROJECTION_Y_PRODUCT": "4106700.000",
            "CORNER_UR_PROJECTION_X_PRODUCT": "532800.000",
            "CORNER_UR_PROJECTION_Y_PRODUCT": "4106700.000",
            "CORNER_LL_PROJECTION_X_PRODUCT": "300600.000",
            "CORNER_LL_PROJECTION_Y_PRODUCT": "3870600.000",
            "CORNER_LR_PROJECTION_X_PRODUCT": "532800.000",
            "CORNER_LR_PROJECTION_Y_PRODUCT": "3870600.000"
        },
        "LEVEL1_PROCESSING_RECORD": {
            "ORIGIN": "Image courtesy of the U.S. Geological Survey",
            "DIGITAL_OBJECT_IDENTIFIER": "https://doi.org/10.5066/P975CC9B",
            "REQUEST_ID": "1867062_00011",
            "LANDSAT_SCENE_ID": "LC91070352024091LGN00",
            "LANDSAT_PRODUCT_ID": "LC09_L1TP_107035_20240331_20240331_02_T1",
            "PROCESSING_LEVEL": "L1TP",
            "COLLECTION_CATEGORY": "T1",
            "OUTPUT_FORMAT": "GEOTIFF",
            "DATE_PRODUCT_GENERATED": "2024-03-31T03:23:17Z",
            "PROCESSING_SOFTWARE_VERSION": "LPGS_16.4.0",
            "FILE_NAME_BAND_1": "LC09_L1TP_107035_20240331_20240331_02_T1_B1.TIF",
            "FILE_NAME_BAND_2": "LC09_L1TP_107035_20240331_20240331_02_T1_B2.TIF",
            "FILE_NAME_BAND_3": "LC09_L1TP_107035_20240331_20240331_02_T1_B3.TIF",
            "FILE_NAME_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_B4.TIF",
            "FILE_NAME_BAND_5": "LC09_L1TP_107035_20240331_20240331_02_T1_B5.TIF",
            "FILE_NAME_BAND_6": "LC09_L1TP_107035_20240331_20240331_02_T1_B6.TIF",
            "FILE_NAME_BAND_7": "LC09_L1TP_107035_20240331_20240331_02_T1_B7.TIF",
            "FILE_NAME_BAND_8": "LC09_L1TP_107035_20240331_20240331_02_T1_B8.TIF",
            "FILE_NAME_BAND_9": "LC09_L1TP_107035_20240331_20240331_02_T1_B9.TIF",
            "FILE_NAME_BAND_10": "LC09_L1TP_107035_20240331_20240331_02_T1_B10.TIF",
            "FILE_NAME_BAND_11": "LC09_L1TP_107035_20240331_20240331_02_T1_B11.TIF",
            "FILE_NAME_QUALITY_L1_PIXEL": "LC09_L1TP_107035_20240331_20240331_02_T1_QA_PIXEL.TIF",
            "FILE_NAME_QUALITY_L1_RADIOMETRIC_SATURATION": "LC09_L1TP_107035_20240331_20240331_02_T1_QA_RADSAT.TIF",
            "FILE_NAME_ANGLE_COEFFICIENT": "LC09_L1TP_107035_20240331_20240331_02_T1_ANG.txt",
            "FILE_NAME_ANGLE_SENSOR_AZIMUTH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_VAA.TIF",
            "FILE_NAME_ANGLE_SENSOR_ZENITH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_VZA.TIF",
            "FILE_NAME_ANGLE_SOLAR_AZIMUTH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_SAA.TIF",
            "FILE_NAME_ANGLE_SOLAR_ZENITH_BAND_4": "LC09_L1TP_107035_20240331_20240331_02_T1_SZA.TIF",
            "FILE_NAME_METADATA_ODL": "LC09_L1TP_107035_20240331_20240331_02_T1_MTL.txt",
            "FILE_NAME_METADATA_XML": "LC09_L1TP_107035_20240331_20240331_02_T1_MTL.xml",
            "FILE_NAME_CPF": "LC09CPF_20240101_20240331_02.03",
            "FILE_NAME_BPF_OLI": "LO9BPF20240331000639_20240331010451.01",
            "FILE_NAME_BPF_TIRS": "LT9BPF20240330231532_20240331010000.01",
            "FILE_NAME_RLUT": "LC09RLUT_20230701_20531231_02_10.h5",
            "DATA_SOURCE_ELEVATION": "GLS2000",
            "GROUND_CONTROL_POINTS_VERSION": "5",
            "GROUND_CONTROL_POINTS_MODEL": "791",
            "GEOMETRIC_RMSE_MODEL": "4.848",
            "GEOMETRIC_RMSE_MODEL_Y": "3.390",
            "GEOMETRIC_RMSE_MODEL_X": "3.466",
            "GROUND_CONTROL_POINTS_VERIFY": "230",
            "GEOMETRIC_RMSE_VERIFY": "3.947"
        },
        "LEVEL1_MIN_MAX_RADIANCE": {
            "RADIANCE_MAXIMUM_BAND_1": "759.15186",
            "RADIANCE_MINIMUM_BAND_1": "-62.69101",
            "RADIANCE_MAXIMUM_BAND_2": "779.71039",
            "RADIANCE_MINIMUM_BAND_2": "-64.38874",
            "RADIANCE_MAXIMUM_BAND_3": "719.32593",
            "RADIANCE_MINIMUM_BAND_3": "-59.40217",
            "RADIANCE_MAXIMUM_BAND_4": "606.02936",
            "RADIANCE_MINIMUM_BAND_4": "-50.04610",
            "RADIANCE_MAXIMUM_BAND_5": "371.43658",
            "RADIANCE_MINIMUM_BAND_5": "-30.67335",
            "RADIANCE_MAXIMUM_BAND_6": "92.32716",
            "RADIANCE_MINIMUM_BAND_6": "-7.62441",
            "RADIANCE_MAXIMUM_BAND_7": "31.11184",
            "RADIANCE_MINIMUM_BAND_7": "-2.56923",
            "RADIANCE_MAXIMUM_BAND_8": "683.93420",
            "RADIANCE_MINIMUM_BAND_8": "-56.47951",
            "RADIANCE_MAXIMUM_BAND_9": "145.17802",
            "RADIANCE_MINIMUM_BAND_9": "-11.98885",
            "RADIANCE_MAXIMUM_BAND_10": "25.00330",
            "RADIANCE_MINIMUM_BAND_10": "0.10038",
            "RADIANCE_MAXIMUM_BAND_11": "22.97172",
            "RADIANCE_MINIMUM_BAND_11": "0.10035"
        },
        "LEVEL1_MIN_MAX_REFLECTANCE": {
            "REFLECTANCE_MAXIMUM_BAND_1": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_1": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_2": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_2": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_3": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_3": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_4": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_4": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_5": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_5": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_6": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_6": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_7": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_7": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_8": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_8": "-0.099980",
            "REFLECTANCE_MAXIMUM_BAND_9": "1.210700",
            "REFLECTANCE_MINIMUM_BAND_9": "-0.099980"
        },
        "LEVEL1_MIN_MAX_PIXEL_VALUE": {
            "QUANTIZE_CAL_MAX_BAND_1": "65535",
            "QUANTIZE_CAL_MIN_BAND_1": "1",
            "QUANTIZE_CAL_MAX_BAND_2": "65535",
            "QUANTIZE_CAL_MIN_BAND_2": "1",
            "QUANTIZE_CAL_MAX_BAND_3": "65535",
            "QUANTIZE_CAL_MIN_BAND_3": "1",
            "QUANTIZE_CAL_MAX_BAND_4": "65535",
            "QUANTIZE_CAL_MIN_BAND_4": "1",
            "QUANTIZE_CAL_MAX_BAND_5": "65535",
            "QUANTIZE_CAL_MIN_BAND_5": "1",
            "QUANTIZE_CAL_MAX_BAND_6": "65535",
            "QUANTIZE_CAL_MIN_BAND_6": "1",
            "QUANTIZE_CAL_MAX_BAND_7": "65535",
            "QUANTIZE_CAL_MIN_BAND_7": "1",
            "QUANTIZE_CAL_MAX_BAND_8": "65535",
            "QUANTIZE_CAL_MIN_BAND_8": "1",
            "QUANTIZE_CAL_MAX_BAND_9": "65535",
            "QUANTIZE_CAL_MIN_BAND_9": "1",
            "QUANTIZE_CAL_MAX_BAND_10": "65535",
            "QUANTIZE_CAL_MIN_BAND_10": "1",
            "QUANTIZE_CAL_MAX_BAND_11": "65535",
            "QUANTIZE_CAL_MIN_BAND_11": "1"
        },
        "LEVEL1_RADIOMETRIC_RESCALING": {
            "RADIANCE_MULT_BAND_1": "1.2541E-02",
            "RADIANCE_MULT_BAND_2": "1.2880E-02",
            "RADIANCE_MULT_BAND_3": "1.1883E-02",
            "RADIANCE_MULT_BAND_4": "1.0011E-02",
            "RADIANCE_MULT_BAND_5": "6.1359E-03",
            "RADIANCE_MULT_BAND_6": "1.5252E-03",
            "RADIANCE_MULT_BAND_7": "5.1395E-04",
            "RADIANCE_MULT_BAND_8": "1.1298E-02",
            "RADIANCE_MULT_BAND_9": "2.3982E-03",
            "RADIANCE_MULT_BAND_10": "3.8000E-04",
            "RADIANCE_MULT_BAND_11": "3.4900E-04",
            "RADIANCE_ADD_BAND_1": "-62.70355",
            "RADIANCE_ADD_BAND_2": "-64.40162",
            "RADIANCE_ADD_BAND_3": "-59.41405",
            "RADIANCE_ADD_BAND_4": "-50.05611",
            "RADIANCE_ADD_BAND_5": "-30.67949",
            "RADIANCE_ADD_BAND_6": "-7.62593",
            "RADIANCE_ADD_BAND_7": "-2.56974",
            "RADIANCE_ADD_BAND_8": "-56.49081",
            "RADIANCE_ADD_BAND_9": "-11.99125",
            "RADIANCE_ADD_BAND_10": "0.10000",
            "RADIANCE_ADD_BAND_11": "0.10000",
            "REFLECTANCE_MULT_BAND_1": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_2": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_3": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_4": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_5": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_6": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_7": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_8": "2.0000E-05",
            "REFLECTANCE_MULT_BAND_9": "2.0000E-05",
            "REFLECTANCE_ADD_BAND_1": "-0.100000",
            "REFLECTANCE_ADD_BAND_2": "-0.100000",
            "REFLECTANCE_ADD_BAND_3": "-0.100000",
            "REFLECTANCE_ADD_BAND_4": "-0.100000",
            "REFLECTANCE_ADD_BAND_5": "-0.100000",
            "REFLECTANCE_ADD_BAND_6": "-0.100000",
            "REFLECTANCE_ADD_BAND_7": "-0.100000",
            "REFLECTANCE_ADD_BAND_8": "-0.100000",
            "REFLECTANCE_ADD_BAND_9": "-0.100000"
        },
        "LEVEL1_THERMAL_CONSTANTS": {
            "K1_CONSTANT_BAND_10": "799.0284",
            "K2_CONSTANT_BAND_10": "1329.2405",
            "K1_CONSTANT_BAND_11": "475.6581",
            "K2_CONSTANT_BAND_11": "1198.3494"
        },
        "LEVEL1_PROJECTION_PARAMETERS": {
            "MAP_PROJECTION": "UTM",
            "DATUM": "WGS84",
            "ELLIPSOID": "WGS84",
            "UTM_ZONE": "54",
            "GRID_CELL_SIZE_PANCHROMATIC": "15.00",
            "GRID_CELL_SIZE_REFLECTIVE": "30.00",
            "GRID_CELL_SIZE_THERMAL": "30.00",
            "ORIENTATION": "NORTH_UP",
            "RESAMPLING_OPTION": "CUBIC_CONVOLUTION"
        }
    }
}

では、バンド2を処理するパラメータを確認します。

  • RADIANCE_MULT_BAND_2: 1.2880E-02
  • RADIANCE_ADD_BAND_2: -64.40162
  • EARTH_SUN_DISTANCE: 0.9989679
  • SUN_ELEVATION: 52.32909743

このパラメータを元に処理します。

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


RADIANCE_MULT_BAND_2 = 1.2880E-02
RADIANCE_ADD_BAND_2  = -64.40162
EARTH_SUN_DISTANCE   = 0.9989679
SUN_ELEVATION        = 52.32909743

# バンド読み込み
img_dn = tifffile.imread('LC09_L1TP_107035_20240331_20240331_02_T1_B2.TIF')

# 補正
img_radiance =  img_dn * RADIANCE_MULT_BAND_2 + RADIANCE_ADD_BAND_2
img_reflectance = np.pi * img_radiance * EARTH_SUN_DISTANCE**2 / np.cos((90 - SUN_ELEVATION)*np.pi/180)

# スケール調整
img_log = np.log(img_reflectance + 1e-1)

# 可視化
plt.figure(figsize=(16, 10), facecolor='white')
plt.imshow(img_log, cmap='Blues', 
           interpolation='nearest',
           vmin=4, vmax=6,
           )
plt.colorbar()

Sentinel-2

Sentinel-2 には Sen2Cor というツールを ESA が提供してくれています。

https://step.esa.int/main/snap-supported-plugins/sen2cor/

Sen2Cor v2.11の各 OS に従ってダウンロードをしてインストールすると使用できます。

使い方は PDFに記載されています。

Python でのラッパーも公開されているので Shell 実行ではなく、プログラムで自動処理したい方は以下を使用するといいかもしれません。

https://github.com/c-core-labs/sen2cor

Sentinel-2 での処理前後の比較は以下です。

その他

衛星のプロバイダーによってこの辺りは技術や目的も異なるので実装自体は秘密であることが多いです。
文献でも 6S モデルなどのように有名なモデリングもあるので単純なものからカスタムしていく方がいいと思います。

これからの光学衛星の動き

衛星が得意としている定点観測は、自動的な変化検知 を可能にします。
特にディープラーニングへの 強い特徴量 が機械学習や解析で求められているので、それらをより安定させるような基盤の物理モデルや理論に基づいた 正確な処理 は必須になっています。

衛星データが増えれば増えるほど、様々な仮説検証の機会は増すし、同時に補正できるようになっていきます。そのためにも 基本的な処理や知識 は押さえておきたいですね。

具体的にも、Pleiades Neo, Planet Labs もどんどん開発が加速しています。
そして先日には、Maxar WorldView Legion 12 も打ち上げられてこれからの衛星データの活躍にホントに期待です。

さいごに

最後まで読んでくださってありがとうございます。
皆さんのご参考になれば嬉しいです。また、間違ってるところがあれば教えて欲しいです。
SAR だけではなく、光学衛星もよく遊んでいるので記事にしていきたいと思います。

おまけ

こちら以外にも記事執筆やコンペ解法記載をしているのでご参考になれば幸いです

https://zenn.dev/syu_tan

衛星データ解析として、宙畑のライターもしています。

https://sorabatake.jp/?s=秀輔

SAR 解析をよくやっていますが、画像系AI、地理空間や衛星データ、点群データに関心があります。
勉強している人は好きなので楽しく絡んでくれると嬉しいです。

参考

Discussion