Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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 以降のリリースが必要です。

    メモ

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

    すべて折りたたむ

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

    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')

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

    threshold = 0.2;

    指定したしきい値以上のスコアを持つピクセルについて、強度値 1 のバイナリ イメージを生成します。その他のすべてのピクセルでは値が 0 です。値が 1 のバイナリ イメージ内の領域は、データ キューブ内でしきい値より大きい NDVI 値を持つ植生領域に対応します。

    bw = ndviImg > threshold;

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

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

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

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

    インディアン パイン データセットの 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);

    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 contains 17 objects of type line. Axes object 2 with title Non-vegetation endmembers contains 3 objects of type line.

    入力引数

    すべて折りたたむ

    入力ハイパースペクトル データ。hypercube オブジェクトとして指定します。関数はオブジェクトの DataCube プロパティからハイパースペクトル データ キューブを読み取ってから、各ピクセルの NDVI 値を計算します。

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

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

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

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

    出力引数

    すべて折りたたむ

    出力 NDVI イメージ。サイズ M 行 N 列の行列として返されます。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 で導入