Классифицируйте гиперспектральное изображение Используя подписи библиотеки и SAM

В этом примере показано, как классифицировать пиксели на гиперспектральное изображение при помощи алгоритма классификации спектральных угловых картопостроителей (SAM). Этот алгоритм классифицирует каждый пиксель на тестовые данные путем вычисления спектрального счета соответствия между спектром пикселя и чистыми спектральными подписями, считанными из спектральной библиотеки ECOSTRESS. Этот пример использует выборку данных от набора данных Jasper Ridge как тестовые данные. Тестовые данные содержат четыре endmembers скрытых, состоя из дорог, почвы, воды и деревьев. В этом примере вы будете:

  1. Сгенерируйте карту счета для различных областей, существующих в тестовых данных путем вычисления спектрального счета соответствия SAM между спектром каждого тестового пикселя и чистым спектром. Чистые спектры от спектральной библиотеки ECOSTRESS.

  2. Классифицируйте области при помощи минимальных критериев счета и присвойте метку класса для каждого пикселя в тестовых данных.

Данные о тесте чтения

Данные о тесте чтения из набора данных Jasper Ridge при помощи hypercube функция. Функция возвращает hypercube объект, который хранит гиперспектральный куб данных и соответствующую длину волны и информации метаданных, считанные из тестовых данных. Тестовые данные имеют 198 диапазонов и их диапазон длин волн от 399,4 нм до 2 457 нм. Спектральное разрешение составляет до 9,9 нм, и пространственное разрешение каждого изображения полосы 100 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, пиксель состоит полностью из того одного поверхностного материала. Библиотека является компиляцией более чем 3 400 спектральных подписей и для естественных и для искусственных материалов. Поскольку вы знаете endmembers скрытое в тестовых данных, выбираете спектральные файлы библиотеки ECOSTRESS, связанные с теми четырьмя endmembers.

Считайте спектральные файлы, связанные с водой, растительностью, почвой и бетоном от спектральной библиотеки 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. Функция возвращает массив с теми же пространственными размерностями как гиперспектральный куб данных и образовывает канал равная количеству заданных подписей библиотеки. Каждый канал содержит карту счета для одной подписи библиотеки. В этом примере существует пять спектральных файлов библиотеки ECOSTRESS, заданных для сравнения, и у каждой полосы гиперспектрального куба данных есть пространственные размерности 100 100 пикселей. Размер выходного массива карт счета таким образом 100 100 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] Крюзе, F.A., А.Б. Лефкофф, Дж.В. Боардмен, К.Б. Хейдебречт, А.Т. Шапиро, П.Дж. Барлун и A.F.H. Goetz. “Спектральная система обработки изображений (SIPS) — Интерактивная Визуализация и Анализ Обработки изображений Данных о Спектрометре”. Дистанционное зондирование Среды 44, № 2-3 (май 1993): 145–63. https://doi.org/10.1016/0034-4257 (93) 90 013 Н.

Смотрите также

| | |

Похожие темы