Main Content

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

nfindr

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

R2020a 以降

    説明

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

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

    メモ

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

    Image Processing Toolbox Hyperspectral Imaging LibraryMATLAB® Online™ または MATLAB Mobile™ ではサポートされないため、デスクトップの MATLAB が必要となります。

    すべて折りたたむ

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

    hcube = hypercube('paviaU.hdr');

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

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

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

    endmembers = nfindr(hcube.DataCube,numEndmembers);

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

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

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

    hcube = hypercube('paviaU.hdr');

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

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

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

    endmembers = nfindr(hcube.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)]});

    入力引数

    すべて折りたたむ

    入力ハイパースペクトル データ。3 次元数値配列または hypercube オブジェクトとして指定します。入力が hypercube オブジェクトの場合、関数はその DataCube プロパティからハイパースペクトル データを読み取ります。

    ハイパースペクトル データはサイズが M x N x 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,'Method','None')

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

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

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

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

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

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

    データ型: char | string

    出力引数

    すべて折りたたむ

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

    データ型: 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 で導入