はじめに
Google Earth Engine (GEE) で衛星画像、特にLandsatシリーズを扱う際に便利なのが、雲を自動で除去してくれるアルゴリズムです。複雑な雲マスク処理を自分でコーディングしなくても、GEEに組み込まれた機能を使えば、驚くほど簡単にクリアな画像を作成できます。
この記事では、Landsat 8の画像コレクションを対象に、GEEの便利な組み込みアルゴリズム ee.Algorithms.Landsat.simpleComposite
を使って、雲の少ない合成画像を生成する最もシンプルな方法を解説します。
※本記事は、Udemyの動画教材「Google Earth Engine Mega Course」の内容を参考に、筆者自身の学習過程で得た知見や、つまづきやすいポイントを補足しながら作成しています。
この記事のゴール
本記事を通じて、以下の手順を理解・習得できます。
対象読者
- Google Earth Engineで手軽に雲除去を試したい方
- Landsat画像の基本的な扱い方を知りたい方
- GEEの便利な組み込みアルゴリズムに興味がある方
雲マスキングについて
なぜ雲マスキングが必要なの?
衛星画像は、地表面の情報を正確に捉えることが目的ですが、雲やその影が存在すると、以下のような問題が発生します。
-
地表面の情報を隠してしまう:
雲の下にある土地や建物、植生の状態が観測できなくなります。 -
分析結果の誤差:
雲を地表面の変化として誤って検知してしまい、土地被覆分類や時系列変化の分析で大きな誤差を生む原因となります。
そのため、精度の高い分析を行うためには、解析の前にこれらの不要なピクセルを特定し、データから取り除く「雲マスキング」という前処理が不可欠です。
なぜ simpleComposite が便利なのか?
通常、衛星画像から雲を除去するには、雲の特性(明るさ、温度など)や品質情報バンド(QAバンド)を使ってマスクを作成し、画像に適用するという手順が必要です。この方法は柔軟性が高い一方で、コードが複雑になりがちです。
一方、今回使用する、ee.Algorithms.Landsat.simpleComposite
は、以下のような特徴を持つ非常に便利なアルゴリズムです。
- 内部で雲スコアリングを実行: 画像コレクションの中から、各ピクセルで最も「雲らしくない」ピクセルを自動で選択します。
- シンプルな処理: 複雑なパラメータ設定は不要で、画像コレクションを渡すだけで雲が少ない1枚の画像(コンポジット)を生成してくれます。
- 反射率への変換も同時にできる: オプションを指定すれば、元のセンサー値(DN値)から物理的な意味を持つTOA(大気上端)反射率(0〜1の値)へ自動で変換してくれます。
使用データ
-
衛星データ: Landsat 8 C02 T1
「USGS Landsat 8 Collection 2 Tier 1 TOA Reflectance」は、アメリカ地質調査所(USGS)が提供する衛星画像です。これは大気補正前のTOA(大気上端)反射率のデータです。T1は地形補正済みの高品質なデータを示します。- データセット名:
LANDSAT/LC08/C02/T1
- Google Earth Engineデータカタログ:「USGS Landsat 8 Collection 2 Tier 1 TOA Reflectance」
- データセット名:
手順
スクリプト全体像
まずは完成したコードの全体像です。これをCode Editorに貼り付ければすぐに実行できます。
// script.js — Landsat 8 を使ったシンプルな雲マスキング
// 1. 緯度経度を指定して関心領域 (AOI) を定義
var aoi = ee.Geometry.Point([-0.2757, 5.7409]);
// 2. Landsat 8 Level-1 の生データを読み込む
var l8raw = ee.ImageCollection("LANDSAT/LC08/C02/T1");
// 3. 場所と期間でフィルタリング
var cloudyImage = l8raw
.filterBounds(aoi)
.filterDate("2020-01-01", "2020-12-01");
// 4. simpleComposite() を使って、雲の少ない合成画像を生成
// 'asFloat: true' はDN値を反射率 (0–1) に変換し、浮動小数点数の画像を出力する
var cloudFree = ee.Algorithms.Landsat.simpleComposite({
collection: cloudyImage,
asFloat: true
});
// 5. 可視化パラメータを定義
// 雲なし合成画像は反射率 (0–1) の値を使用
var cloudFreeVis = {
min: 0,
max: 0.5,
bands: ["B4", "B3", "B2"] // 自然色 (RGB)
};
// 生データはDN値 (0–30000) を使用
var cloudyVis = {
min: 0,
max: 30000,
bands: ["B4", "B3", "B2"]
};
// 6. 結果を表示
Map.centerObject(aoi, 7);
Map.addLayer(cloudFree, cloudFreeVis, "雲なし合成画像");
Map.addLayer(cloudyImage, cloudyVis, "雲あり生データ");
コードのステップ別解説
ここからは、上記のスクリプトをブロックごとに詳しく解説します。
1:関心領域 (ROI) の設定
分析したい場所を定義します。今回は西アフリカのガーナ周辺を緯度経度で指定しています。
// 1. 西アフリカの単一の点を使い、関心領域 (AOI) を定義
var aoi = ee.Geometry.Point([-0.2757, 5.7409]);
スクリプト抜粋 | 意味・目的 |
---|---|
var aoi = ee.Geometry.Point(...) |
指定した経度・緯度の点を関心領域(Area of Interest)として設定。 |
2: Landsat 8 データの読み込み
GEEのデータカタログにあるUSGS Landsat 8 Collection 2 Tier 1から、Landsat 8 のLevel-1データを読み込みます。
var l8raw = ee.ImageCollection("LANDSAT/LC08/C02/T1");
スクリプト抜粋 | 意味・目的 |
---|---|
ee.ImageCollection("LANDSAT/LC08/C02/T1") |
Landsat 8、Collection 2、Tier 1の画像コレクション全体をl8rawという変数に格納。 |
3: データの絞り込み
膨大な全球データの中から、必要な場所と期間の画像だけを抽出します。
var cloudyImage = l8raw
.filterBounds(aoi)
.filterDate("2020-01-01", "2020-12-01");
スクリプト抜粋 | 意味・目的 |
---|---|
.filterBounds(aoi) |
aoi (関心領域)と重なる画像のみを抽出。 |
.filterDate(...,...) |
指定した期間に撮影された画像のみを抽出。 |
4: 雲除去合成画像の生成
この処理が、本記事の核心部分です。
雲を自動で除去してくれる、GEE組み込みアルゴリズムsimpleComposite
を使って、雲の少ない1枚の画像を生成します。
var cloudFree = ee.Algorithms.Landsat.simpleComposite({
collection: cloudyImage,
asFloat: true
});
スクリプト抜粋 | 意味・目的 |
---|---|
ee.Algorithms.Landsat.simpleComposite({ ... }) |
Landsat用の便利アルゴリズム群の中からsimpleCompositeを呼び出します。 |
collection: cloudyImage |
処理対象として、手順3で絞り込んだ画像コレクション(cloudyImage )を指定。 |
asFloat: true |
これをtrueにすると、元のセンサー値(DN値)がTOA(大気上端)反射率(0〜1の浮動小数点数)に自動で変換されます。これにより、物理的に意味のある値として画像を扱えるようになります。 |
5: 可視化パラメータの定義
処理前と処理後の画像は、ピクセルの値の範囲(スケール)が異なるため、それぞれに適した表示設定を定義します。
// 処理前(生データ)はDN値 (0–30000) を使用
var cloudyVis = {
min: 0,
max: 30000,
bands: ["B4", "B3", "B2"]// 自然色 (RGB)
};
// 処理後(雲なし合成画像)は反射率 (0–1) の値を使用
var cloudFreeVis = {
min: 0,
max: 0.5,
bands: ["B4", "B3", "B2"] // 自然色 (RGB)
};
スクリプト抜粋 | 意味・目的 |
---|---|
var cloudyVis = { ... } |
処理前の生データ(DN値: 0〜65535)用の表示設定です。ここではmax: 30000 としています。 |
var cloudFreeVis = { ... } |
雲除去後の画像(反射率: 0〜1)用の表示設定です。max: 0.5 とすることで、反射率が0.5以上の明るい部分が白飛びするように見せ、コントラストを調整しています。 |
bands: ["B4", "B3", "B2"] |
自然な色合い(トゥルーカラー)の画像で表示するため、赤(B4)、緑(B3)、青(B2)のバンドをRGBに割り当てています。 |
6: 結果の表示
最後に、処理前後の画像を地図に表示して、効果を比較します。
Map.centerObject(aoi, 7);
Map.addLayer(cloudFree, cloudFreeVis, "雲なし合成画像");
Map.addLayer(cloudyImage, cloudyVis, "雲あり生データ");
スクリプト抜粋 | 意味・目的 |
---|---|
Map.centerObject(aoi, 7) |
地図の表示を、設定したaoiが中心に来るように調整します。7 はズームレベル。 |
Map.addLayer(..., ..., ...) |
処理前、または処理後の画像を地図に追加。括弧内は順に、地図に追加したい画像の変数、ステップ5で設定した表示設定の変数、設定したい画像の名前を入力。 |
実行結果の比較
スクリプトを実行すると、GEEの地図上に2つのレイヤーが表示されます。
-
雲あり生データ:
処理前の画像コレクションの生データです。雲に覆われた画像がそのまま表示されるため、場所によっては真っ白に見えます。 -
雲なし合成画像:
GEEの組み込みアルゴリズムsimpleComposite
を使って生成した画像です。雲に覆われていた部分が、同じ場所の別の時期の晴れた日のピクセルで補完され、地表面の様子がクリアに見えるようになります。
まとめ
今回は、GEEの組み込みアルゴリズムee.Algorithms.Landsat.simpleComposite
を使って、Landsat 8の画像から簡単に雲を除去する方法を紹介しました。
この手法のポイントは以下の通りです。
- たった1行のコードで、複雑な雲スコアリングと合成処理を実行できる。
-
asFloat: true
オプションを使えば、反射率への変換も同時に行える。 - Landsat画像の初期分析や、手早くクリアな背景画像が欲しい場合に非常に強力。
より高度な分析ではQAバンドを使った手動のマスキングが必要になる場面もありますが、多くの場合、このsimpleCompositeだけで十分な品質の雲なし画像を得ることができます。
参考文献
- Udemy: Google Earth Engine Mega Course
- Google Earth Engine Data Catalog: USGS Landsat 8 Collection 2 Tier 1 TOA Reflectance