ライブラリ シグネチャと SAM を使用したハイパースペクトル イメージの分類
この例では、スペクトル角マッパー (SAM) アルゴリズムを使用してハイパースペクトル イメージの分類を実行する方法を示します。このアルゴリズムは、ピクセルのスペクトルと、ECOSTRESS スペクトル ライブラリから読み取ったピュア スペクトル シグネチャの間のスペクトル一致スコアを計算して、テスト データ内の各ピクセルを分類します。この例では、Jasper Ridge データセットのデータ サンプルをテスト データとして使用します。テスト データには、道路、土壌、水、および樹木から構成される 4 つの潜在エンドメンバーが格納されています。この例では、次の作業を行います。
各テスト ピクセルのスペクトルとピュア スペクトルの間の SAM スペクトル一致スコアを計算し、テスト データ内に存在するさまざまな領域のスコア マップを生成します。ピュア スペクトルは ECOSTRESS スペクトル ライブラリから取得します。
最小スコア基準を使用して領域を分類し、テスト データ内の各ピクセルにクラス ラベルを割り当てます。
この例には、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® が必要です。
テスト データの読み取り
Jasper Ridge データセットからテスト データをhypercubeオブジェクトとして読み取ります。このオブジェクトには、テスト データから読み取ったハイパースペクトル データ キューブ、および対応する波長とメタデータの情報が格納されます。テスト データには、198 個のスペクトル バンドと、399.4 nm ~ 2457 nm の範囲の波長が含まれています。スペクトル分解能は最大 9.9 nm、各バンド イメージの空間分解能は 100 x 100 です。
hcube = imhypercube("jasperRidge2_R198.img")hcube =
hypercube with properties:
ImageDims: "[100x100x198 int16]"
Wavelength: [198×1 double]
Metadata: [1×1 struct]
BlockSize: [100 100]
データ キューブから RGB イメージを推定します。コントラスト ストレッチを適用して出力 RGB イメージのコントラストを向上させます。
rgbImg = colorize(hcube,Method="rgb",ContrastStretching=true);テスト データの RGB イメージを表示します。
figure imagesc(rgbImg); axis image off title("RGB Image of Data Cube")

ECOSTRESS スペクトル ライブラリからのシグネチャの読み取り
ECOSTRESS スペクトル ライブラリは、個々の表面物質のピュア スペクトル シグネチャで構成されています。ピクセルのスペクトルが ECOSTRESS ライブラリのシグネチャと一致する場合、そのピクセルは完全にその表面物質単体で構成されています。このライブラリは天然物質と人工物質の両方について、3400 以上のスペクトル シグネチャをまとめたものです。テスト データ内の潜在エンドメンバーは把握しているため、それら 4 つのエンドメンバーに関係する ECOSTRESS スペクトル ライブラリ ファイルを選択します。
ECOSTRESS スペクトル ライブラリから水、植生、土壌、およびコンクリートに関係するスペクトル ファイルを読み取ります。次のタイプのスペクトル シグネチャを使用します。
道路およびハイウェイ構造物を分類する人工物
砂、シルト、粘土の領域を分類する土壌
樹木の領域を分類する植生
水のある領域を分類する水
filenames = ["water.seawater.none.liquid.tir.seafoam.jhu.becknic.spectrum.txt",... "vegetation.tree.eucalyptus.maculata.vswir.jpl087.jpl.asd.spectrum.txt",... "soil.utisol.hapludult.none.all.87p707.jhu.becknic.spectrum.txt",... "soil.mollisol.cryoboroll.none.all.85p4663.jhu.becknic.spectrum.txt",... "manmade.concrete.pavingconcrete.solid.all.0092uuu_cnc.jhu.becknic.spectrum.txt"]; lib = readEcostressSig(filenames)
lib=1×5 struct array with fields:
Name
Type
Class
SubClass
ParticleSize
Genus
Species
SampleNo
Owner
WavelengthRange
Origin
CollectionDate
Description
Measurement
FirstColumn
SecondColumn
WavelengthUnit
DataUnit
FirstXValue
LastXValue
NumberOfXValues
AdditionalInformation
Wavelength
Reflectance
⋮
ライブラリ構造体からクラス名を抽出します。
classNames = [lib.Class];
ECOSTRESS スペクトル ライブラリから読み取ったピュア スペクトル シグネチャをプロットします。
figure hold on for idx = 1:numel(lib) plot(lib(idx).Wavelength,lib(idx).Reflectance,LineWidth=2) end axis tight box on title("Pure Spectral Signatures from ECOSTRESS Library") xlabel("Wavelength (\mum)") ylabel("Reflectance (%)") legend(classNames,Location="northeast") title(legend,"Class Names") hold off

テスト データ内のピクセルのスコア マップの計算
関数 spectralMatch を使用して、各ピクセル スペクトルとライブラリ シグネチャの間のスペクトル一致スコアを見つけます。既定の設定では、関数 spectralMatch は SAM 分類アルゴリズムを使用して 2 つのスペクトル間の類似度を計算します。この関数は、ハイパースペクトル データ キューブと同じ空間次元を持つ配列と、指定したライブラリ シグネチャの数に等しいチャネルを返します。各チャネルには、1 つのライブラリ シグネチャのスコア マップが格納されます。この例では、比較用に指定した ECOSTRESS スペクトル ライブラリ ファイルが 5 つあり、ハイパースペクトル データ キューブの各帯域の空間次元は 100 x 100 ピクセルです。したがって、スコア マップの出力配列のサイズは 100 x 100 x 5 となります。
scoreMap = spectralMatch(lib,hcube);
スコア マップを表示します。
figure
montage(scoreMap,Size=[1 numel(lib)],BorderSize=10)
title("Score Map Obtained for Each Pure Spectrum",FontSize=14)
colormap(jet);
colorbar
最小スコア基準を使用したピクセルの分類
SAM の値が小さくなるほどスペクトルの類似度が高くなります。最小スコア基準を使用すると、ライブラリ シグネチャの中の各ピクセルに最適に一致するものを見つけることでテスト ピクセルを分類できます。その結果、ピクセル単位の分類マップが得られますが、そこでは各ピクセルの値が lib のライブラリ シグネチャ ファイルのインデックスとなり、そのピクセルは最も小さい SAM 値を示します。たとえば、分類マップ内のピクセルの値が 1 の場合、そのピクセルは lib 内の最初のライブラリ シグネチャに対して高い類似性を示します。
[~,classMap] = min(scoreMap,[],3);
分類マップの値を、スペクトル マッチングに使用する ECOSTRESS ライブラリ シグネチャにマッピングするクラス テーブルを作成します。
classTable = table((min(classMap(:)):max(classMap(:)))',classNames',... VariableNames=["Classification map value","Matching library signature"])
classTable=5×2 table
Classification map value Matching library signature
________________________ __________________________
1 "Sea Water"
2 "Tree"
3 "Utisol"
4 "Mollisol"
5 "Concrete"
ハイパースペクトル データの RGB イメージおよび分類結果を表示します。視覚的に検査すると、スペクトル マッチングにより各ピクセルが効果的に分類されていることが分かります。
fig = figure(Position=[0 0 700 300]); axes1 = axes(Parent=fig,Position=[0.04 0 0.4 0.9]); imagesc(rgbImg,Parent=axes1); axis off title("RGB Image of Data Cube") axes2 = axes(Parent=fig,Position=[0.47 0 0.45 0.9]); imagesc(classMap,Parent=axes2) axis off colormap(jet(numel(lib))) title("Pixel-wise Classification Map") ticks = linspace(1.4,4.8,numel(lib)); colorbar(Ticks=ticks,TickLabels=classNames)

参考文献
[1] Kruse, F.A., A.B. Lefkoff, J.W. Boardman, K.B. Heidebrecht, A.T. Shapiro, P.J. Barloon, and A.F.H. Goetz. "The Spectral Image Processing System (SIPS)—Interactive Visualization and Analysis of Imaging Spectrometer Data." Remote Sensing of Environment 44, no. 2–3 (May 1993): 145–63. https://doi.org/10.1016/0034-4257(93)90013-N.
[2] ECOSTRESS Spectral Library: https://speclib.jpl.nasa.gov
[3] Meerdink, Susan K., Simon J. Hook, Dar A. Roberts, and Elsa A. Abbott. “The ECOSTRESS Spectral Library Version 1.0.” Remote Sensing of Environment 230 (September 2019): 111196. https://doi.org/10.1016/j.rse.2019.05.015.
[4] Baldridge, A.M., S.J. Hook, C.I. Grove, and G. Rivera. “The ASTER Spectral Library Version 2.0.” Remote Sensing of Environment 113, no. 4 (April 2009): 711–15. https://doi.org/10.1016/j.rse.2008.11.007.
参考
hypercube | colorize | readEcostressSig | spectralMatch