Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ライブラリ シグネチャと SAM を使用したハイパースペクトル イメージの分類

この例では、スペクトル角マッパー (SAM) 分類アルゴリズムを使用して、ハイパースペクトル イメージ内のピクセルを分類する方法を示します。このアルゴリズムは、ピクセルのスペクトルと、ECOSTRESS スペクトル ライブラリから読み取ったピュア スペクトル シグネチャの間のスペクトル一致スコアを計算して、テスト データ内の各ピクセルを分類します。この例では、Jasper Ridge データセットのデータ サンプルをテスト データとして使用します。テスト データには、道路、土壌、水、および樹木から構成される 4 つの潜在エンドメンバーが格納されています。この例では、次の作業を行います。

  1. 各テスト ピクセルのスペクトルとピュア スペクトルの間の SAM スペクトル一致スコアを計算し、テスト データ内に存在するさまざまな領域のスコア マップを生成します。ピュア スペクトルは ECOSTRESS スペクトル ライブラリから取得します。

  2. 最小スコア基準を使用して領域を分類し、テスト データ内の各ピクセルにクラス ラベルを割り当てます。

テスト データの読み取り

関数 hypercube を使用して Jasper Ridge データセットからテスト データを読み取ります。この関数は、ハイパースペクトル データ キューブおよびテスト データから読み取った対応する波長とメタデータの情報を格納する hypercube オブジェクトを返します。テスト データには、198 個のスペクトル バンドと、399.4 nm ~ 2457 nm の範囲の波長が含まれています。スペクトル分解能は最大 9.9 nm、各バンド イメージの空間分解能は 100 x 100 です。

hcube = hypercube('jasperRidge2_R198.img')
hcube = 
  hypercube with properties:

      DataCube: [100×100×198 int16]
    Wavelength: [198×1 double]
      Metadata: [1×1 struct]

データ キューブから 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 スペクトル ライブラリから水、植生、土壌、およびコンクリートに関係するスペクトル ファイルを読み取ります。次のタイプのスペクトル シグネチャを使用します。

  • 道路およびハイウェイ構造物を分類する人工物

  • 砂、シルト、粘土の領域を分類する土壌

  • 樹木の領域を分類する植生

  • 水のある領域を分類する水

fileroot = matlabshared.supportpkg.getSupportPackageRoot();
addpath(fullfile(fileroot,'toolbox','images','supportpackages','hyperspectral',...
    'hyperdata','ECOSTRESSSpectraFiles'));

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.

参考

| | |

関連するトピック