[Google Earth Engine入門]雲のない画像を探す/雲を消す
概要
衛星写真の中には、撮影範囲のほとんどが雲に覆われてしまっているものも多数あります。
なるべく雲に覆われていない衛星写真が見つかれば問題ありませんが、絞り込みをかけた期間や位置によっては、雲が覆われていない画像を見つけることができない場合もあります。
ここでは、イメージコレクションのなかから被雲率の低いイメージを見つける方法と、複数のイメージを合成して雲を削除する方法について記載します。
データセットをロードする
1 2 3 4 5 6 7 8 |
// 1年間のLandsat 8 TOAデータを取得する var ImageCollection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') .filterDate('2016-01-01', '2016-12-31') .filterBounds(geometry) var image = ImageCollection.first() Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3}); |
被雲率が低い順に並べる
イメージコレクションの中から、できるだけ被雲率が低いイメージを抜き出すために、メタデータ「CLOUD_COVER」の値を使ってソートします。
1 2 3 4 5 6 7 8 |
var ImageCollection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') .filterDate('2016-01-01', '2016-12-31') .filterBounds(geometry) .sort("CLOUD_COVER", true) //propertiesのCLOUD_COVER値でソートする(true:昇順、false:降順) var image = ImageCollection.first() Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3}); |
ただし、この方法は1枚の衛星画像を選び出すことになるので、複数の衛星画像を合成した画像などには使えません。
合成した衛星画像を地図にオーバーレイする
イメージコレクションを中央値で合成し地図上にオーバーレイします。
1 2 3 4 5 6 |
// 1年間のLandsat 8 TOAデータを取得する var composite = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') .filterDate('2016-01-01', '2016-12-31') .median(); Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], max: 0.3}); |
モザイクとして合成するためには多くの衛星画像が必要になるため、どうしても雲が含まれた画像も必要になります。
もちろん、加工前のイメージコレクションの段階で被雲率の高い画像を省くことはできますが、その場合モザイクのところどころに空きが発生したりします。
この問題を解決するために、モザイク化する際の合成の段階で雲を削除します。
クオリティアセスメントバンド値を利用して雲をマスクする
Landsat 8号には、「Quality Assessment Band」というメタデータを8ビットのバイナリストリングとして表現したデータが含まれています。
バイナリーデータには、雲の有無を表すビットがありオンオフ(0 or 1)をチェックすることで、イメージないの雲の領域を判別しマスクを作成することができます。
雲によって隠れてしまっている領域に、他の(雲がかかっていない)衛星写真のデータを合成(マスク処理)することで、衛星画像から雲を削除します。
参考:
マスク処理は、特定の部分のみを表示(抽出)し、それ以外の部分を表示しない(黒色画像または白色画像)ようにする画像処理のことをいいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// クオリティアセスメントバンドを利用して雲をマスクする var mask = function(image) { var qa = image.select('BQA'); /// クラウドビットがオフであることを確認 // 参考 https://landsat.usgs.gov/collectionqualityband var mask = qa.bitwiseAnd(1 << 4).eq(0); return image.updateMask(mask); } // 1年間のLandsat 8 TOAデータを取得する var composite = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') .filterDate('2016-01-01', '2016-12-31') .map(mask) .median(); Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], max: 0.3}); |
アドベントカレンダー
この記事は、Google Earth / Google Earth Engine Advent Calendar 2018への参加投稿です。