Main Content

spectralMatch

スペクトル ライブラリを使用した未知の領域または物質の識別

R2020a 以降

    説明

    score = spectralMatch(libData,hcube) は、各ピクセルのスペクトル シグネチャを ECOSTRESS スペクトル ライブラリ libData から読み取ったスペクトル データと照合し、ハイパースペクトル データ キューブ内の領域を識別します。

    score = spectralMatch(libData,reflectance,wavelength) は、reflectance および wavelength として指定された分光反射率値を ECOSTRESS スペクトル ライブラリ libData で入手できる値と照合し、領域または物質を識別します。

    score = spectralMatch(___,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 が必要となります。

    すべて折りたたむ

    スペクトル マッチング法では、ハイパースペクトル データ キューブ内にある各ピクセルのスペクトル シグネチャを、ECOSTRESS スペクトル ファイルの植生の基準スペクトル シグネチャと比較します。

    ECOSTRESS スペクトル ライブラリから植生のスペクトル シグネチャを読み取ります。

    filename = 'vegetation.tree.tsuga.canadensis.vswir.tsca-1-47.ucsb.asd.spectrum.txt';
    libData = readEcostressSig(filename);

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

    hcube = hypercube('paviaU.hdr');

    基準スペクトルに対する、ハイパースペクトル データ ピクセルのスペクトルの距離スコアを計算します。

    score = spectralMatch(libData,hcube);

    距離スコアを表示します。距離スコアの小さいピクセルは基準スペクトルと強く一致するため、植生領域に属している可能性が高くなります。

    figure
    imagesc(score)
    colorbar

    植生領域に対応する距離スコアを検出するためのしきい値を定義します。

    threshold = 0.3;

    指定したしきい値未満のスコアを持つピクセルについて、強度値 1 を割り当ててバイナリ イメージを生成します。他の領域には強度値 0 を割り当てます。バイナリ イメージ内の最大強度の領域は、ハイパースペクトル データ キューブ内の植生領域に対応します。

    bw = score < threshold;

    バイナリ イメージ内の最大強度の領域のインデックスを使用して、ハイパースペクトル データ キューブの植生領域をセグメント化します。

    T = reshape(hcube.DataCube,[size(hcube.DataCube,1)*size(hcube.DataCube,2) size(hcube.DataCube,3)]);
    Ts = zeros(size(T));
    Ts(bw == 1,:) = T( bw==1 ,:);
    Ts = reshape(Ts,[size(hcube.DataCube,1) size(hcube.DataCube,2) size(hcube.DataCube,3)]);

    .セグメント化された植生領域のみを含む新しい hypercube オブジェクトを作成します。

    segmentedDataCube = hypercube(Ts,hcube.Wavelength);

    関数 colorize を使用して、元のデータ キューブとセグメント化されたデータ キューブの RGB カラー イメージを推定します。

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

    関数 imoverlay を使用して、元のデータ キューブの RGB バージョンにバイナリ イメージを重ね合わせます。

    B = imoverlay(rgbImg,bw,'Yellow');

    元のデータ キューブとセグメント化されたデータ キューブの RGB カラー イメージ、および重ね合わせたイメージを表示します。セグメント化されたイメージには、元のデータ キューブからセグメント化された植生領域のみが含まれています。

    figure
    montage({rgbImg segmentedImg B},'Size',[1 3])
    title(['Original Image | ' 'Segmented Image | ' 'Overlayed Image'])

    ECOSTRESS スペクトル ライブラリから基準スペクトル シグネチャを読み取ります。このライブラリは、人工物質、土壌、水、植生に属する 15 のスペクトル シグネチャで構成されています。出力は、ECOSTRESS ライブラリ ファイルから読み取ったスペクトル データを格納する構造体配列です。

    dirname = fullfile(matlabroot,'toolbox','images','supportpackages','hyperspectral','hyperdata','ECOSTRESSSpectraFiles');
    libData = readEcostressSig(dirname);

    未知の物質の反射率と波長値を含む .mat ファイルをワークスペースに読み込みます。反射率値と波長値を合わせてテスト スペクトルが構成されます。

    load spectralData 'reflectance' 'wavelength'

    スペクトル情報発散 (SID) 法を使用して、基準スペクトルとテスト スペクトルの間のスペクトルの一致を計算します。関数は、帯域幅がテスト スペクトルと重なり合う基準スペクトルのみの距離スコアを計算します。その他のスペクトルにはすべて警告メッセージが表示されます。

    score = spectralMatch(libData,reflectance,wavelength,'Method','SID');

    テスト スペクトルの距離スコアを表示します。距離スコアの小さいピクセルは基準スペクトルと強く一致します。距離スコア値 NaN は、対応する基準スペクトルとテスト スペクトルが、帯域幅の重複部分のしきい値を満たしていないことを示します。

    score
    score = 1×15
    
      297.8016  122.5567  203.5864  103.3351  288.7747  275.5321  294.2341       NaN       NaN  290.4887       NaN  299.5762  171.6919   46.2072  176.6637
    
    

    最小の距離スコアと対応するインデックスを求めます。返されたインデックス値は、テスト スペクトルに最も厳密に一致する基準スペクトルを含む構造体配列 libData の行を示します。

    [value,ind] = min(score);

    最小距離スコアのインデックスを使用して一致する基準スペクトルを求め、ECOSTRESS ライブラリ内の一致するスペクトル データの詳細を表示します。結果から、テスト スペクトルが海水のスペクトル シグネチャに最も厳密に一致することが分かります。

    matchingSpectra = libData(ind)
    matchingSpectra = struct with fields:
                         Name: "Sea Foam"
                         Type: "Water"
                        Class: "Sea Water"
                     SubClass: "none"
                 ParticleSize: "Liquid"
                        Genus: [0×0 string]
                      Species: [0×0 string]
                     SampleNo: "seafoam"
                        Owner: "Dept. of Earth and Planetary Science, John Hopkins University"
              WavelengthRange: "TIR"
                       Origin: "JHU IR Spectroscopy Lab."
               CollectionDate: "N/A"
                  Description: "Sea foam water. Original filename FOAM Original ASTER Spectral Library name was jhu.becknic.water.sea.none.liquid.seafoam.spectrum.txt"
                  Measurement: "Directional (10 Degree) Hemispherical Reflectance"
                  FirstColumn: "X"
                 SecondColumn: "Y"
               WavelengthUnit: "micrometer"
                     DataUnit: "Reflectance (percent)"
                  FirstXValue: "14.0112"
                   LastXValue: "2.0795"
              NumberOfXValues: "2110"
        AdditionalInformation: "none"
                   Wavelength: [2110×1 double]
                  Reflectance: [2110×1 double]
    
    

    テスト スペクトルの反射率値および対応する基準スペクトルの反射率値をプロットします。反射率曲線の形状をプロットして可視化するため、反射率の値を範囲 [0, 1] に再スケーリングし、基準反射率値の合計に一致するようにテスト反射率値を内挿します。

    figure
    testReflectance = rescale(reflectance,0,1);
    refReflectance = rescale(matchingSpectra.Reflectance,0,1);
    testLength = length(testReflectance);
    newLength = length(testReflectance)/length(refReflectance);
    testReflectance = interp1(1:testLength,testReflectance,1:newLength:testLength);
    
    plot(refReflectance)
    hold on
    plot(testReflectance,'r')
    hold off
    legend('Matching reference reflectance','Test reflectance')
    xlabel('Number of samples')
    ylabel('Reflectance value')

    入力引数

    すべて折りたたむ

    スペクトル ライブラリからのスペクトル データ。構造体または 1 行 K 列の構造体配列として指定します。K は、スペクトル マッチングに使用するライブラリからのスペクトル シグネチャの数です。各スペクトル ライブラリ構造体には、関数 readEcostressSig を使用して ECOSTRESS ライブラリから読み取られたスペクトル シグネチャなど、等しい長さの数値ベクトルで構成される Reflectance フィールドと Wavelength フィールドが含まれていなければなりません。

    入力ハイパースペクトル データ。hypercube オブジェクトとして指定します。hypercube オブジェクトの DataCube プロパティにはハイパースペクトル データ キューブが格納されます。

    反射率値。C 要素ベクトルとして指定します。C は反射率値を測定した波長の数です。

    波長値。C 要素ベクトルとして指定します。C は反射率値を測定した波長の数です。

    名前と値の引数

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

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

    例: spectralMatch(libData,hcube,'MinBandWidth',0.5)

    スペクトル マッチング法。'Method' と次の値のいずれかで構成されるコンマ区切りのペアとして指定します。

    • 'sam' — スペクトル角マッパー (SAM) 法。2 つのスペクトル間の角距離を計算して、それらの類似度を評価します。

    • 'sid' — スペクトル情報発散 (SID) 法。2 つのスペクトルの確率分布値の差を計算して、それらの類似度を評価します。

    • 'sidsam' — 複合型のスペクトル類似度評価法。SID と SAM の距離尺度を組み合わせて 2 つのスペクトル間の類似度を評価します。

    • 'jmsam' — ジェフリー・松下スペクトル角マッパー (JMSAM)。ジェフリー・松下 (JM) と SAM の距離尺度を組み合わせて 2 つのスペクトル間の類似度を評価します。

    • 'ns3' — 正規化スペクトル類似度スコア (Normalized spectral similarity score、NS3) 法。ユークリッドと SAM の距離尺度を組み合わせて 2 つのスペクトル間の類似度を評価します。

    これらのスペクトル マッチング法の詳細については、アルゴリズムを参照してください。

    データ型: char | string

    帯域幅の重複部分の最小値。'MinBandWidth' と正のスカラー (ナノメートル単位) から構成されるコンマ区切りのペアとして指定します。基準スペクトルとテスト スペクトルの帯域幅の重複部分は次のように定義されます。

    BWoverlap = Wmax − Wmin

    Wmin は、基準スペクトルおよびテスト スペクトルの最小波長の最大値です。

    Wmax は、基準スペクトルおよびテスト スペクトルの最大波長の最大値です。

    引数 'MinBandWidth' は、テスト物質のスペクトル値と ECOSTRESS スペクトル データの間の帯域幅の重複部分の最小期待値を定義します。

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

    出力引数

    すべて折りたたむ

    距離スコア。3 次元数値配列、行列、K 要素の列ベクトル、またはスカラーとして返されます。出力スコアの次元は、libData の次元、およびテスト データが hypercube オブジェクトであるか wavelengthreflectance のペアであるかによって異なります。

    テスト スペクトル シグネチャが hypercube オブジェクトとして指定された場合、hcube およびデータ キューブのサイズは M x N x C となります。

    入力引数の次元 (libData)出力の次元 (score)
    1 行 K 列。K 個のスペクトル ファイルから読み取った K 個の基準シグネチャを含む

    サイズが M x N x K の 3 次元数値配列。K 個の基準シグネチャを基準とするピクセルごとの距離スコアを含む

    K の各チャネルの値は、libData の対応する行のスペクトル データを基準とする、ピクセルごとのスペクトルの距離スコアです。同様に、2 番目のチャネルの値は libData の 2 番目の行のスペクトル データに関連しています。

    1 行 1 列。1 つのスペクトル ファイル (K = 1) から読み取った基準シグネチャを含むサイズが M 行 N 列の行列。基準シグネチャを基準とするピクセルごとのスペクトルの距離スコアを含む。

    テスト スペクトル シグネチャが reflectance および wavelength の値で指定された場合は、次のようになります。

    入力引数の次元 (libData)出力の次元 (score)
    1 行 K 列。K 個のスペクトル ファイルから読み取った K 個の基準シグネチャを含むK 要素のベクトル。K 個の基準シグネチャを基準とするテスト スペクトルの距離スコアを含む。このベクトルの各要素は、libData の対応する行のスペクトル データを基準とする、テスト反射率値の距離スコアです。
    1 行 1 列。1 つのスペクトル ファイル (K = 1) から読み取った基準シグネチャを含むスカラー

    データ型: double

    制限

    Method"sam""sid""jmsam"、または "ns3" として指定した場合、この関数は、パフォーマンスが既に最適化されているため、parfor ループをサポートしません。 (R2023a 以降)

    アルゴリズム

    すべて折りたたむ

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

    "sam" 法の場合、関数 spectralMatch は、次の式を使用して SAM スコア α を計算します。

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

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

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

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

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

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

    SID-SAM

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

    SIDSAM=SID×tan(α)

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

    ジェフリー・松下スペクトル角マッパー (JMSAM)

    "jmsam" 法の場合、関数 spectralMatch は、次の式を使用して JMSAM スコアを計算します。

    JMSAM=JMdistance×tan(α)

    JMdistance は JM 距離、α は SAM スコアです。この手法では、次の式を使用して JM 距離を計算します。

    JMdistance=2(1eB)

    B はバタチャリヤ距離で、以下のようになります。

    B=18(μtμr)T[σt+σr2]1(μtμr)+12ln[|σt+σr2||σt||σr|]

    μr および μt は、それぞれ基準スペクトルとテスト スペクトルの平均値です。σr および σt は、それぞれ基準スペクトルとテスト スペクトルの共分散値です。

    正規化スペクトル類似度スコア (Normalized Spectral Similarity Score、NS3)

    "ns3" 法の場合、関数 spectralMatch は、次の式を使用して NS3 スコアを計算します。

    NS3=AEuclidean2+(1cos(α))2

    AEuclidean はユークリッド距離、α は SAM スコアです。この手法では、次の式を使用してユークリッド距離を計算します。

    AEuclidean=1Ci=1C(tiri)2

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

    バージョン履歴

    R2020a で導入