Gopro Hero4 + IRProで撮影した画像からNDVI算出

with コメントはまだありません

こちらの記事で、Goproカメラに特殊なレンズを装着し、UAVによる上空からのNDVI画像の撮影方法を紹介しました。記事で示されている画像は、3つのチャネルをコンポジットした画像です。言ってしまえば、フォルスカラー画像(近赤外、緑、赤色をそれぞれRGBのチャネルに割り当てた、植生の箇所を強調した画像)です。

NDVIは、近赤外と赤の波長帯の反射率画像から、各ピクセルで正規化を施した画像になります。普通の画像と異なり、レイヤーが一枚の画像で各ピクセルがNDVIの値を持っています。今回は、そのNDVIのラスターデータ(画像形式のデータ)の出力方法をPythonで紹介します。画像は、GeoQuantzで撮影した画像を利用します。

利用するPythonライブラリ

GDAL

衛星画像などの地理空間データを扱う代表的なライブラリ。UAVで撮影した画像を読み込むのに使います。

numpy

Pythonの数値計算ライブラリ。このライブラリを元に機械学習などの数多くのライブラリが開発されています。GDALも同じです。

matplotlib

グラフ描画などのライブラリ。処理結果などをグラフや画像で描画するときに使います。

Pythonコード

GithubのJupyter notebookにコードを上げました。以下が処理の流れです。

  1. 処理に必要なライブラリをインポート
  2. 処理する画像を読み込み、画像データをnumpyの配列へと変換
  3. 変換した配列の要素数やデータ型を確認
  4. 1から3バンドまでの配列データをint8からfloat32へとデータ型を変換(NDVIは少数の値をとるので)、また、配列の値が0の要素に対しnumpyのnull値を代入
  5. データ型を変換した配列(3バンド)をmatplotlibで描画
  6. NDVIの計算(numpyの配列演算をしているので、for文を書かずにすみます。Pythonはfor文処理が遅いので、配列演算はnumpyのAPIを使います)
  7. 処理したNDVIの結果をmatplotlibで描画
  8. NDVIの配列データに含まれる、numpyのnull値を-9999に置き換える
  9. 処理したNDVIの配列データをTiff画像に出力

今回処理した画像

今回処理した画像をQGISで読み込み、画像として出力しました。

上の画像は、いわゆるフォルスカラーの画像です。茶色っぽい箇所が植生活性度が高いということを示しています。

2枚目の上の画像は、今回処理したNDVIのラスターデータです。黒い箇所がNDVIの値が低く、白く明るくなっている箇所が高いことを示しています。

 

より植生っぽく緑色に見せたのが3枚目の上の画像です。

処理したNDVI画像を確認すると、フォルスカラーの画像上で植生が存在する箇所ほどNDVIの値が高く、そうでないところはNDVI値が低いことがわかります。

次回は、GDALなどの環境構築方法を紹介します。

Leave a Reply