#背景
衛星画像からニューラルネットワーク回帰を使用して、クロロフィル値を求める研究をしています。
そのためにまずは、データの取得・前処理として、衛星画像データから緯度経度を指定してその地点のピクセル値を取得する方法について書いていきたいと思います。
その前に衛星画像とはなんぞや↓
衛星データの基本
#使用する衛星画像データ
Landsat8の画像を使用します。
AWSでオープンデータとして公開されいます。
AWS Landsatデータ
AWSで公開されているlandsatの画像データは、pathとrowなどを指定して位置から検索できます。
ちなみに、今回は琵琶湖のデータを使用するので、path 110 row 35のデータを探して取得しました。
上記のページに、取得可能なシーンの全リストがあるので、それをpathとrowでソートして取得しました。
pathとrowを確認する方法はこちら↓
path/row coverter
#使用するライブラリ
rasterioとpyprojを使用します。
rasterioは、ラスターデータを扱うためのライブラリです。
rasterio
pyprojは、座標系を変換するライブラリです。
pyproj
Landsatのデータは、Geotifファイル形式になっており、座標のデータがタグとして埋め込まれているのですが、UTM座標を使用しているため、緯度経度からUTM座標系に変換する必要があります。
import rasterio as rio import pyproj
↑事前にpipなどのでインストールしてください。
#rasterioでGeotifの読み込み
B5 = rio.open('ファイルのパス')
#座標系の変換
utm = pyproj.Proj(B5.crs) lonlat = pyproj.Proj(init='epsg:4326') lat,lon = (35.445,136.0638888889) east,north = pyproj.transform(lonlat,utm,lon,lat)
緯度経度が、UTMの座標系に変換されたことを確認します。
east,north
(596554.9414823324, 3922913.584464462)
#座標からその地点の画像のrow,columnを取得
データはarray型になっていて、indexメソッドで座標に対応するrowとcolumnが取得できます。
row, col = B5.index(east,north)
print(f'row,col=({row},{col})')
row,col=(6086,5625)
また、arrayのデータのピクセル値にアクセスするためには下記のコードが必要です。
B5read = B5.read(1)
この1は、衛星画像のバンドのインデックスですが、今回はバンド5一つなので、1を指定。
#ピクセル値を取得
B5read[row,col]
21530
#まとめ
以上ですが、これで簡単に緯度経度から指定した地点のピクセル値が求められます。
しかしこのピクセル値は、DN値といって、太陽の光の強さや角度などの影響を受けた値となっており、クロロフィル値をアウトプットとしたニューラルネットワークの入力に使用するにはTOAという反射率に変換しようと思っています。ほんとは大気補正とかして純粋なSR(Surface Reflectance)を求めたいところですが、難しいので今回はあきらめて、次回はTOAを求めるやり方をご紹介したいと思います。
衛星画像の処理レベルについてはこちら↓
図解!衛星データの前処理とは
最後までお読みいただきありがとうございます!