メインコンテンツ

nfindr

N-FINDR を使用したエンドメンバー シグネチャの抽出

    説明

    endmembers = nfindr(inputData,numEndmembers) は、N-finder (N-FINDR) アルゴリズムを使用してハイパースペクトル データ inputData からエンドメンバー シグネチャを抽出します。numEndmembers は N-FINDR アルゴリズムを使用して抽出するエンドメンバー シグネチャの数です。N-FINDR 法の詳細については、アルゴリズムを参照してください。

    endmembers = nfindr(inputData,numEndmembers,Name=Value) では、前の構文の入力引数に加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。この構文を使用して、反復および次元削減の回数のオプションを設定します。

    メモ

    この関数には、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("paviaU.hdr");

    関数 countEndmembersHFC を使用して、ハイパースペクトル データ キューブ内に存在する、スペクトル的に異なるエンドメンバーの数を求めます。

    numEndmembers = countEndmembersHFC(hcube,PFA=10^-7);

    N-FINDR 法を使用してエンドメンバーを計算します。既定では、関数 nfindr は最大ノイズ フラクション (MNF) 変換を使用して前処理を行います。反復回数の既定値は、推定されたエンドメンバー数の 3 倍です。

    datacube = gather(hcube);
    endmembers = nfindr(datacube,numEndmembers);

    ハイパースペクトル データのエンドメンバーをプロットします。

    figure
    plot(endmembers)
    xlabel("Band Number")
    ylabel("Pixel Values")
    ylim([0 9000])
    title({"Endmembers Spectra","Number of Endmembers = "+num2str(numEndmembers)});

    Figure contains an axes object. The axes object with title Endmembers Spectra Number of Endmembers = 8, xlabel Band Number, ylabel Pixel Values contains 8 objects of type line.

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

    hcube = imhypercube("paviaU.hdr");

    関数 countEndmembersHFC を使用して、ハイパースペクトル データ キューブ内に存在する、スペクトル的に異なるエンドメンバーの数を求めます。

    numEndmembers = countEndmembersHFC(hcube,PFA=10^-7);

    N-FINDR 法を使用してエンドメンバーを計算します。反復回数の値を 1000 に指定します。次元削減方法として主成分分析 (PCA) を選択して前処理を行います。

    datacube = gather(hcube);
    endmembers = nfindr(datacube,numEndmembers,NumIterations=1000,ReductionMethod="PCA");

    ハイパースペクトル データのエンドメンバーをプロットします。

    figure
    plot(endmembers)
    xlabel("Band Number")
    ylabel("Pixel Values")
    ylim([0 9000])
    title({"Endmembers Spectra","Number of Endmembers = "+num2str(numEndmembers)});

    Figure contains an axes object. The axes object with title Endmembers Spectra Number of Endmembers = 8, xlabel Band Number, ylabel Pixel Values contains 8 objects of type line.

    入力引数

    すべて折りたたむ

    入力ハイパースペクトル データ。3 次元数値配列または hypercube オブジェクトとして指定します。

    ハイパースペクトル データ キューブはサイズが M×N×C の数値配列です。M および N はそれぞれハイパースペクトル データ内の行と列の数です。C はハイパースペクトル データ内のスペクトル バンドの数です。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    抽出するエンドメンバーの数。正のスカラー整数として指定します。この値は [1 C] の範囲になければなりません。C は入力ハイパースペクトル データ内のスペクトル バンドの数です。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    名前と値の引数

    すべて折りたたむ

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

    例: nfindr(cube,7,NumIterations=100,ReductionMethod="None")

    反復回数。正のスカラー整数として指定します。既定値は 3P です。P は抽出対象のエンドメンバー シグネチャの数です。このアルゴリズムの計算時間は、反復回数の増加とともに増大します。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    次元削減方法。次のいずれかの値に指定します。

    • "MNF" — 最大ノイズ フラクション (MNF) 法を使用して次元削減を実行します。これは既定の設定です。

    • "PCA" — 主成分分析 (PCA) 法を使用して次元削減を実行します。

    この引数を指定すると、関数はまず指定された方法を使用して入力データのスペクトル次元を削減します。その後、削減されたデータからエンドメンバー シグネチャを計算します。

    データ型: char | string

    出力引数

    すべて折りたたむ

    エンドメンバー シグネチャ。サイズが CP 列で入力ハイパースペクトル データと同じデータ型の行列として返されます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    アルゴリズム

    N-FINDR はハイパースペクトル データのエンドメンバーを求めるための反復手法です。この方法は、エンドメンバー (最もピュアなピクセル) により構成されるシンプレックスのボリュームが、他のピクセルの組み合わせで定義される他のどのボリュームよりも大きいことを前提とします [1]。含まれる手順をまとめると以下のとおりです。

    1. 主成分バンドを計算し、MNF または PCA を使用して入力データのスペクトル次元を削減します。抽出する主成分バンドの数は、抽出するエンドメンバーの数と等しく設定されます。エンドメンバーは主成分バンドから抽出されます。

    2. 削減されたデータから、エンドメンバーの初期セットとして n 個のピクセル スペクトルをランダムに選択します。

    3. 反復 1 では、エンドメンバーの初期セットを {e1(1),e2(1),,ep(1)} と記述します。

      エンドメンバーをシンプレックスの頂点と考え、次を使用してボリュームを計算します。

      V(E(1))=|det(E(1))|

      ここで、E(1)=[111e1(1)e2(1)ep(1)] です。

    4. 反復 2 では、新しいピクセル スペクトル r を選択します。ただし、r{e1(1),e2(1),,ep(1)} です。

    5. セット内の各エンドメンバーを r で置き換え、シンプレックスのボリューム V(E(2)) を計算します。

    6. 計算されたボリューム V(E(2))V(E(1)) より大きい場合は、セット内の ith 番目のエンドメンバーを r で置き換えます。これにより、エンドメンバーのセットが更新されます。たとえば、i = 2 の場合、2 回目の反復の最後に導出された新しいエンドメンバーのセットは {e1(2),e2(2)=r,,ep(2)} です。

    7. 各反復で、新しいピクセル スペクトル r を選択し、手順 5 と 6 を繰り返します。反復するごとにエンドメンバーのセットが更新されます。総反復回数が、指定された値 NumIterations に達すると反復が終了します。

    参照

    [1] Winter, Michael E. “N-FINDR: An Algorithm for Fast Autonomous Spectral End-Member Determination in Hyperspectral Data.” Proc. SPIE Imaging Spectrometry V 3753, (October 1999): 266–75. https://doi.org/10.1117/12.366289.

    バージョン履歴

    R2020a で導入