衛星画像で軽石検出に挑戦〜GoogleEarthEngineを用いた方法〜
※本記事はトライアルです。正確な情報とは限らない点をご留意ください。
はじめに
こんにちは、UMITRONの宮山(@jkatagi)です。
今年の8月に小笠原諸島付近で海底火山の噴火が起こりました。
この噴火によって発生した軽石が沖縄に漂流してきているようです。この軽石を養殖魚が餌と間違って飲み込んでしまったり、エラに入ってしまうことにより、沖縄の養殖業者が被害を受けています。
また海洋開発研究機構(JAMSTEC)が行ったシミュレーションによると、この軽石は今後黒潮に乗って本州に接近してくると予想されています(詳しくは下記記事を参照してください)
これらの記事を読みながら、軽石が今どこにあるのかを衛星画像で把握できないか? といった疑問が湧いてきました。そこでGoogle Earth Engineを用いて軽石検出の可能性を探ってみました。
Google Earth Engineとは
Google Earth Engine(以下、GEE)はGoogleが提供する解析ツールで、その特徴はクラウドで衛星画像を処理し、ブラウザでその結果を表示することができる点です。一般的には衛星画像は1枚1枚のサイズが非常に大きいため、手元のパソコンにダウンロードするのに時間がかかったり処理も計算能力の高いパソコンが必要になります。一方でGEEはGoogleの提供するクラウドを使うことによってデータを手元にダウンロードする必要はなく、またクラウドで計算することができるため高性能なパソコンは必要ありません(しかも無料...)。なお利用は教育や研究、開発に制限されています。
また手前味噌ですがGEEについては入門記事を以前に公開していますので、興味のある方はぜひご覧ください:
早速画像を見てみる
さて話を戻して、実際に衛星画像を見てみましょう。
今回は空間解像度の高い(10m)Sentinel-2Aを選択しました。まずはRGB画像を見てみます。GEEのdatasets検索にSentinelを入力し、
↑の `See example` をいじって(期間と緯度経度を変えて)沖縄付近を表示してみました:
沖縄付近のRGB画像です(中心緯度経度 = 128.0768285144796,26.703266227408598)。画像をよくみてみると、帯状の茶色のような筋が見えます。
拡大してみると船の波の跡とは明らかに違う色をしています。この茶色っぽい筋がどうやら軽石のようです(念の為昨年の同時期の画像を比較して判断しました)。GEEではInspectorというツールを使うことにより、クリックしたPixelの値を確認できます:
この値を元に、RGBに該当する波長のバンド(Band4, Band3, Band2)の値をfilterし、軽石と思われる部分を抽出してみます。今回はいくつか海のPixelをクリックして比較しながらざっくりと1000で区切りました。
抽出後の画像がこちらです:
陸域や雲が残っていますが、海と軽石(と思われる領域)を分離することができました。冒頭に載せた漁港のあたりを拡大してみると、かなり軽石が流れてきてることが分かります。
↑抽出後の画像と航空写真のオーバーレイ
↑去年の同じ時期の画像(2021/10/01-2020/10/30)
さらに雲と軽石(と思われる領域)を区別するために近赤外領域の波長のBand9に対し、こちらもざっくり1000で区切ってみました:
結果として軽石(と思われる領域)以外をほぼ除去することができました。
なおBand9の値を1000で切ってしまうと先程検知できていた漁港付近の領域が検知できなくなってしまったので、偽陽性・偽陰性などを減らすためにはもう少し丁寧に(物質の物理特性に基づいた閾値の設定やバンドの選択を)する必要がありそうです。参考までに今回使用したコードを記載します:
// 今回用いたコード。GEEのexampleを元にした
function maskS2clouds(image) {
var qa = image.select('QA60');
var blue = image.select('B2');
var green = image.select('B3');
var red = image.select('B4');
var b9 = image.select('B9');
// Bits 10 and 11 are clouds and cirrus, respectively.
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0))
.and(blue.gt(1000))
.and(green.gt(1000))
.and(red.gt(1000))
.and(b9.lt(1000));
return image.updateMask(mask).divide(10000);
}
var dataset = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate('2021-10-25', '2021-10-30')
// Pre-filter to get less cloudy granules.
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20)) // 20
.map(maskS2clouds)
var visualization = {
min: 0.0,
max: 0.3,
bands: ['B4', 'B3', 'B2'],
};
Map.setCenter(128.0768285144796,26.703266227408598, 12);
Map.addLayer(dataset, visualization, 'RGB');
おわりに
今回は軽石を衛星画像で検知できるかを、かなりざっくりしたやり方でGEE上で検証してみました。ざっくりしたやり方なため考慮すべき点はたくさんありますが、今後は各種研究機関からより正確な軽石の地図情報が出されることを期待しつつ、引き続き軽石の動きに注意していきたいと思います。