メインコンテンツ

ndvi

    説明

    output = ndvi(spcube) は、データ キューブ内の各ピクセルの正規化植生指標 (NDVI) 値を計算し、NDVI イメージを返します。NDVI イメージは、入力されたハイパースペクトル データまたはマルチスペクトル データの植被領域を表示します。関数はデータ キューブ内の赤 (R) の帯域と近赤外 (NIR) バンド イメージを使用して NDVI 値を計算します。関数 ndvi は赤帯域のイメージに 670 nm、NIR バンド イメージに 800 nm 帯域の反射率値を使用します。

    output = ndvi(spcube,BlockSize=blocksize) は、スペクトル データのブロック処理用のブロック サイズを指定します。 (R2021a 以降)

    この関数は、入力イメージを個別ブロックに分割して各ブロックを処理し、各ブロックの処理結果を連結して出力行列を形成します。スペクトル イメージは、大きすぎてそのままではシステム メモリに収まらない場合のある多次元データ セットです。そのため、関数 ndvi の実行中にシステムでメモリ不足が発生する場合があります。このような問題に直面した場合は、次の構文を使用してブロック処理を実行します。

    たとえば、ndvi(spcube,BlockSize=[50 50]) は、入力イメージを 50 行 50 列のサイズのオーバーラップしないブロックに分割し、各ブロックのピクセルの NDVI 値を計算します。

    メモ

    この関数には、Hyperspectral Imaging Library for Image Processing Toolbox™ が必要です。Hyperspectral Imaging Library for Image Processing Toolbox はアドオン エクスプローラーからインストールできます。アドオンのインストールの詳細については、アドオンの入手と管理を参照してください。

    Hyperspectral Imaging Library for Image Processing Toolbox は、MATLAB® Online™ および MATLAB Mobile™ によってサポートされないため、デスクトップの MATLAB が必要です。

    すべて折りたたむ

    ハイパースペクトル データをワークスペースに読み取ります。

    hcube = imhypercube("indian_pines.dat");

    データ キューブ内のピクセルごとに NDVI 値を計算します。

    ndviImg = ndvi(hcube);

    関数 colorize を使用して、元のデータ キューブからコントラスト ストレッチを行った RGB イメージを推定します。

    rgbImg = colorize(hcube,Method="rgb",ContrastStretching=true);

    元のイメージと NDVI イメージを表示します。

    fig = figure(Position=[0 0 1200 600]);
    axes1 = axes(Parent=fig,Position=[0 0.1 0.4 0.8]);
    imshow(rgbImg,Parent=axes1)
    title("RGB Image of Data Cube")
    axes2 = axes(Parent=fig,Position=[0.45 0.1 0.4 0.8]);
    imagesc(ndviImg,Parent=axes2)
    colorbar
    title("NDVI Image")

    Figure contains 2 axes objects. Axes object 1 with title NDVI Image contains an object of type image. Hidden axes object 2 with title RGB Image of Data Cube contains an object of type image.

    通常、植生領域の NDVI 値は 0.2 を超えます。0.2 以下の NDVI 値は植生がないことを示します。NDVI イメージのしきい値処理を実行し、植生領域をセグメント化します。しきい値を指定します。

    threshold = 0.2;

    しきい値を適用してバイナリ イメージを作成します。値が 1 のバイナリ イメージ内の領域は、データ キューブ内でしきい値より大きい NDVI 値を持つ植生領域に対応します。その他のすべてのピクセルは値が 0 になります。

    bw = ndviImg > threshold;

    RGB イメージ上にバイナリ イメージを重ね合わせ、重ね合わせたイメージを表示します。

    overlayImg = imoverlay(rgbImg,bw,[0 1 0]);
    figure
    imagesc(overlayImg)
    title("Vegetation Region Overlaid on RGB Image")

    Figure contains an axes object. The axes object with title Vegetation Region Overlaid on RGB Image contains an object of type image.

    スペクトル バンドのピクセルの総数および 0.2 より大きい NDVI 値を持つピクセルの数に基づいて植被率を計算します。

    numVeg = find(bw == 1);
    datacube = gather(hcube);
    imgSize = size(datacube,1)*size(datacube,2);
    vegetationCover = length(numVeg)/imgSize
    vegetationCover = 
    0.5696
    

    この例では、以下を行う方法を説明します。

    • ハイパースペクトル関数用の超立方体として 2 次元スペクトル データを使用する。

    • 関数 ndvi を使用して植生スペクトルと非植生スペクトルを区別する。

    この例には、Hyperspectral Imaging Library for Image Processing Toolbox™ が必要です。Hyperspectral Imaging Library for Image Processing Toolbox は、アドオン エクスプローラーからインストールできます。アドオンのインストールの詳細については、アドオンの取得と管理を参照してください。Hyperspectral Imaging Library for Image Processing Toolbox は、MATLAB® Online™ および MATLAB® Mobile™ でサポートされないため、デスクトップの MATLAB® が必要です。

    2 次元スペクトル データの読み込み

    インディアン パイン データセットの 20 個のエンドメンバーを含む 2 次元スペクトル データをワークスペースに読み込みます。

    load("indian_pines_endmembers_20.mat")

    インディアン パイン データセットの各バンドの波長値をワークスペースに読み込みます。

    load("indian_pines_wavelength.mat")

    ハイパースペクトル関数に使用するテスト データの準備

    関数 reshape を使用して 2 次元スペクトル データを 3 次元ボリューム データに形状変更します。

    [numSpectra,spectralDim] = size(endmembers);
    dataCube = reshape(endmembers,[numSpectra 1 spectralDim]);

    3 次元ボリューム データ dataCube および波長情報 wavelength を関数 hypercube に指定して、大きさが 1 の次元で 3 次元 hypercube オブジェクトを作成します。

    hcube = imhypercube(dataCube,wavelength);

    NDVI の計算による植生スペクトルと非植生スペクトルの区別

    hypercube オブジェクト内のスペクトルごとに NDVI 値を計算します。

    ndviVal = ndvi(hcube);

    植生スペクトルは一般的に 0 より大きい NDVI 値をもち、非植生スペクトルは一般的に 0 より小さい NDVI 値をもちます。しきい値処理を実行して植生スペクトルと非植生スペクトルを分離します。

    index = ndviVal > 0;

    植生エンドメンバーと非植生エンドメンバーをプロットします。

    subplot(2,1,1)
    plot(endmembers(index,:)')
    title("Vegetation endmembers")
    xlabel("Bands")
    ylabel("Reflectance Values")
    axis tight
    subplot(2,1,2)
    plot(endmembers(~index,:)')
    title("Non-Vegetation endmembers")
    xlabel("Bands")
    ylabel("Reflectance Values")
    axis tight

    Figure contains 2 axes objects. Axes object 1 with title Vegetation endmembers, xlabel Bands, ylabel Reflectance Values contains 17 objects of type line. Axes object 2 with title Non-Vegetation endmembers, xlabel Bands, ylabel Reflectance Values contains 3 objects of type line.

    入力引数

    すべて折りたたむ

    入力スペクトル データ。hypercube オブジェクトまたは multicube オブジェクトとして指定します。spcubemulticube オブジェクトである場合、そのすべてのスペクトル バンドのデータ解像度は同じでなければなりません。multicube オブジェクトのスペクトル バンドの解像度がすべて同じではない場合、resampleBands 関数を使用して帯域を再サンプリングするか、selectBands 関数を使用して均一な解像度の帯域を選択します。

    データ ブロックのサイズ。正の整数から成る 2 要素ベクトルとして指定します。ベクトルの各要素は、それぞれ各ブロックの行数と列数に対応します。データ ブロックのサイズは入力イメージのサイズより小さくなければなりません。スペクトル イメージを小さなブロックに分割すれば、大きなデータ セットを処理してもメモリ不足に陥ることはありません。

    • blocksize の値が小さすぎると、関数によるメモリの使用量は減りますが、その分実行時間が長くなります。

    • blocksize の値が大きいか、入力イメージのサイズと等しいと、実行時間は短くなりますが、その分メモリの使用量は高くなります。

    例: BlockSize=[20 20] は、各データ ブロックのサイズを 20 行 20 列で指定します。

    出力引数

    すべて折りたたむ

    出力 NDVI イメージ。サイズ MN 列の行列として返されます。M および N は入力データ キューブの空間次元です。入力データ キューブのデータ型が double の場合、出力データ型も double です。それ以外の場合、出力データ型は single です。

    関数は次のようにピクセルごとの NDVI 値を計算します。

    NDVI=NIRRNIR+R,

    値は [-1, 1] の範囲に収まります。値が 1 に近いほど、植生が健全で密集していることを示します。0 は不毛な土壌など、植生が不健全であることを示します。-1 は水域など、植生がないことを示します。

    データ型: single | double

    参照

    “Change Detection of Vegetation Cover by NDVI Technique on Catchment Area of the Panchet Hill Dam, India.” International Journal of Research in Geography 2, no. 3 (2016). https://doi.org/10.20431/2454-8685.0203002.

    [1] Haboudane, D. “Hyperspectral Vegetation Indices and Novel Algorithms for Predicting Green LAI of Crop Canopies: Modeling and Validation in the Context of Precision Agriculture.” Remote Sensing of Environment 90, no. 3 (April 15, 2004): 337–52. https://doi.org/10.1016/j.rse.2003.12.013.

    [2] “Change Detection of Vegetation Cover by NDVI Technique on Catchment Area of the Panchet Hill Dam, India.” International Journal of Research in Geography 2, no. 3 (2016). https://doi.org/10.20431/2454-8685.0203002.

    バージョン履歴

    R2020a で導入

    すべて展開する