メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ndvi

    説明

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

    output = ndvi(hcube,'BlockSize',blocksize) は、名前と値のペアの引数 'BlockSize' を使用して、ハイパースペクトル データ キューブのブロック処理用のブロック サイズを指定します。

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

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

    メモ

    名前と値のペアの引数 'BlockSize' を指定してブロック処理を実行するには、MATLAB® R2021a 以降のリリースが必要です。

    メモ

    この関数には、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 = hypercube("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.8 です。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);
    imgSize = size(hcube.DataCube,1)*size(hcube.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 = hypercube(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 オブジェクトとして指定します。関数はオブジェクトの DataCube プロパティからハイパースペクトル データ キューブを読み取ってから、各ピクセルの NDVI 値を計算します。

    データ ブロックのサイズ。正の整数の 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

    参照

    [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.

    バージョン履歴

    R2020a で導入