Main Content

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

sidsam

スペクトル情報発散とスペクトル角マッパーによるハイブリッド手法を使用したスペクトルの類似度の評価

R2020b 以降

    説明

    score = sidsam(inputData,refSpectrum) は、スペクトル情報発散とスペクトル角マッパー (SID-SAM) によるハイブリッド手法を使用して、ハイパースペクトル データ inputData 内の各ピクセルのスペクトルと、指定した基準スペクトル refSpectrum の間のスペクトルの類似度を評価します。この構文を使用して、ハイパースペクトル データ キューブ内で異なる領域または物質を特定します。SID-SAM 法の詳細については、アルゴリズムを参照してください。

    score = sidsam(testSpectrum,refSpectrum) は SID-SAM ハイブリッド手法を使用して、指定したテスト スペクトル testSpectrum と基準スペクトル refSpectrum の間のスペクトルの類似度を評価します。この構文を使用して、未知の物質のスペクトル シグネチャを基準スペクトルと比較したり、2 つのスペクトル シグネチャ間のスペクトルのばらつきを計算したりします。

    メモ

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

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

    すべて折りたたむ

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

    hcube = hypercube('jasperRidge2_R198.hdr');

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

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

    N-FINDR アルゴリズムを使用してデータ キューブからエンドメンバーのスペクトル シグネチャを抽出します。

    endmembers = nfindr(hcube,numEndmembers);

    抽出したエンドメンバーのスペクトル シグネチャをプロットします。

    figure
    plot(endmembers)
    xlabel('Bands')
    ylabel('Reflectance')
    legend('Location','Bestoutside')

    Figure contains an axes object. The axes object with xlabel Bands, ylabel Reflectance contains 10 objects of type line.

    各エンドメンバーとデータ キューブ内の各ピクセルのスペクトルの間で SID-SAM 距離を計算します。

    score = zeros(size(hcube.DataCube,1),size(hcube.DataCube,2),numEndmembers);
    for i = 1:numEndmembers
        score(:,:,i) = sidsam(hcube,endmembers(:,i));
    end

    すべてのエンドメンバーについて、ピクセル スペクトルごとに取得した距離スコアから最小スコア値を計算します。それぞれの最小スコアのインデックスは、ピクセル スペクトルが最大の類似度を示すエンドメンバー スペクトルを識別します。スコア行列内の空間位置 (x, y) におけるインデックス値 n は、データ キューブ内の空間位置 (x, y) におけるピクセルのスペクトル シグネチャが、n 番目のエンドメンバーのスペクトル シグネチャに最適に一致することを示しています。

    [~,matchingIdx] = min(score,[],3);

    関数 colorize を使用して入力データの RGB イメージを推定します。

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

    RGB イメージおよび一致したインデックス値の行列の両方を表示します。

    figure('Position',[0 0 800 400])
    subplot('Position',[0 0.1 0.4 0.8])
    imagesc(rgbImg)
    axis off
    title('RGB Image of Hyperspectral Data')
    subplot('Position',[0.45 0.1 0.45 0.8])
    imagesc(matchingIdx)
    axis off
    title('Indices of Matching Endmembers')
    colorbar

    Figure contains 2 axes objects. Axes object 1 with title RGB Image of Hyperspectral Data contains an object of type image. Axes object 2 with title Indices of Matching Endmembers contains an object of type image.

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

    hcube = hypercube('jasperRidge2_R198.hdr');

    ハイパースペクトル データの最初の 10 個のエンドメンバーを求めます。

    numEndmembers = 10;
    endmembers = nfindr(hcube,numEndmembers);

    最初のエンドメンバーを基準スペクトル、残りのエンドメンバーをテスト スペクトルと見なします。

    refSpectrum = endmembers(:,1);
    testSpectra = endmembers(:,2:end);

    基準スペクトルおよびその他のエンドメンバー スペクトルをプロットします。

    figure
    plot(refSpectrum,'LineWidth',2);
    hold on
    plot(testSpectra);
    hold off
    label = cell(1,numEndmembers-1);
    label{1} = 'Reference';
    for itr = 1:numEndmembers-1
        label{itr+1} = ['Endmember-' num2str(itr)];
    end
    xlabel('Bands')
    ylabel('Reflectances')
    legend(label,'Location','Bestoutside');

    Figure contains an axes object. The axes object with xlabel Bands, ylabel Reflectances contains 10 objects of type line. These objects represent Reference, Endmember-1, Endmember-2, Endmember-3, Endmember-4, Endmember-5, Endmember-6, Endmember-7, Endmember-8, Endmember-9.

    基準スペクトルとテスト スペクトル間の SID-SAM スコアを計算します。

    score = zeros(1,numEndmembers-1);
    for itr = 1:numEndmembers-1
        testSpectrum = testSpectra(:,itr);
        score(itr) = sidsam(testSpectrum,refSpectrum);
    end

    基準スペクトルに対して類似度が最大 (距離が最小) となるテスト スペクトルを求めます。次に、基準スペクトルに対して類似度が最小 (距離が最大) となるテスト スペクトルを求めます。

    [minval,minidx] = min(score);
    maxMatch = testSpectra(:,minidx);
    [maxval,maxidx] = max(score);
    minMatch = testSpectra(:,maxidx);

    基準スペクトル、類似度が最大のテスト スペクトル、および類似度が最小のテスト スペクトルをプロットします。最小スコア値を持つテスト スペクトルは、基準エンドメンバーに対して最大の類似度を示します。一方、最大スコア値を持つテスト スペクトルはスペクトルのばらつきが最も大きく、2 つの異なる物質のスペクトル挙動の特徴を示しています。

    figure
    plot(refSpectrum,'LineWidth',2)
    hold on
    plot(maxMatch,'k')
    plot(minMatch,'r')
    xlabel('Band Number')
    ylabel('Data Values')
    legend('Reference spectrum','Maximum match test spectrum','Minimum match test spectrum',...
           'Location','Southoutside')
    title('Similarity Between Spectra')
    text(20,1000,['Max score: ' num2str(maxval)],'Color','r')
    text(145,1800,['Min score: ' num2str(minval)],'Color','k')

    Figure contains an axes object. The axes object with title Similarity Between Spectra, xlabel Band Number, ylabel Data Values contains 5 objects of type line, text. These objects represent Reference spectrum, Maximum match test spectrum, Minimum match test spectrum.

    入力引数

    すべて折りたたむ

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

    テスト スペクトル。C 要素ベクトルとして指定します。テスト スペクトルは未知の領域または物質のスペクトル シグネチャです。

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

    基準スペクトル。C 要素ベクトルとして指定します。基準スペクトルは既知の領域または物質のスペクトル シグネチャです。この関数はテスト スペクトルとこれらの値を照合します。

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

    出力引数

    すべて折りたたむ

    SID-SAM スコア。スカラーまたは行列として返されます。出力は以下のようになります。

    • スカラー — 入力引数 testSpectrum を指定した場合。関数はテスト スペクトル シグネチャと基準スペクトル シグネチャを照合し、スカラー値を返します。テスト スペクトルと基準スペクトルはともに同じ長さのベクトルでなければなりません。

    • 行列 — 入力引数 inputData を指定した場合。関数はデータ キューブ内の各ピクセルのスペクトル シグネチャと基準スペクトル シグネチャを照合し、行列を返します。データ キューブのサイズが M x N x C で、基準スペクトルが長さ C のベクトルである場合、出力行列のサイズは M 行 N 列です。

    SID-SAM スコアが小さくなるほど、テスト シグネチャと基準シグネチャが強く一致することを示します。

    データ型: single | double

    アルゴリズム

    すべて折りたたむ

    スペクトル角マッパー (SAM)

    関数 sidsam は、次の式を使用して SAM スコア α を計算します。

    α=cos1(i=1Ctirii=1Cti2i=1Cri2).

    ここで、r および t は、それぞれ基準スペクトルとテスト スペクトルです。ri および ti は、それぞれベクトル r および t の i 番目の要素です。C は、ベクトル r および t の長さです。

    スペクトル情報発散 (SID)

    関数 sidsam は、基準スペクトル refSpectra とテスト スペクトル testSpectra を正規化し、次の式を使用して SID 値を計算します。

    SID=i=1Cpilog(piqi)+i=1Cqilog(qipi).

    q および p は、それぞれ正規化された基準スペクトルとテスト スペクトルのベクトルです。qi および pi は、それぞれベクトル q および p の i 番目の要素です。C は、ベクトル q および p の長さです。

    SID-SAM

    関数 sidsam は、次の式を使用して SID-SAM 値を計算します。

    SIDSAM=SID×tan(α)

    SID は SID 値、α は SAM スコアです。

    参照

    [1] Chang, Chein-I. “New Hyperspectral Discrimination Measure for Spectral Characterization.” Optical Engineering 43, no. 8 (August 1, 2004): 1777. https://doi.org/10.1117/1.1766301.

    バージョン履歴

    R2020b で導入