メインコンテンツ

spectralMatch

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

    説明

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

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

    score = spectralMatch(___,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 が必要です。

    すべて折りたたむ

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

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

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

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

    hcube = imhypercube("paviaU.hdr");

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

    score = spectralMatch(libData,hcube);

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

    imagesc(score)
    colorbar

    Figure contains an axes object. The axes object contains an object of type image.

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

    threshold = 0.3;

    しきい値を適用してバイナリ イメージを作成します。値が 1 のバイナリ イメージ内の領域は、距離スコアがしきい値未満のデータ キューブ内の植生領域に対応します。その他のすべてのピクセルは値が 0 になります。

    bw = score < threshold;

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

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

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

    segmentedDataCube = imhypercube(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 | Overlaid Image")

    Figure contains an axes object. The hidden axes object with title Original Image | Segmented Image | Overlaid Image contains an object of type image.

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

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

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

    load spectralData.mat reflectance wavelength

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

    warning off
    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")

    Figure contains an axes object. The axes object with xlabel Number of samples, ylabel Reflectance value contains 2 objects of type line. These objects represent Matching reference reflectance, Test reflectance.

    入力引数

    すべて折りたたむ

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

    入力ハイパースペクトル データ。hypercube オブジェクトとして指定します。

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

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

    名前と値の引数

    すべて折りたたむ

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

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

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

    スペクトル マッチング方法。次のいずれかの値として指定します。

    • "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

    帯域幅の重複部分の最小値。ナノメートル単位の正のスカラーとして指定します。基準スペクトルとテスト スペクトルの帯域幅の重複部分は次のように定義されます。

    BWoverlap = WmaxWmin

    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) から読み取った基準シグネチャを含むサイズが MN 列の行列。基準シグネチャを基準とするピクセルごとのスペクトルの距離スコアを含む。

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

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

    データ型: double

    制限

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

    アルゴリズム

    すべて折りたたむ

    バージョン履歴

    R2020a で導入