exponenta event banner

Идентификация материала конечных элементов с использованием спектральной библиотеки

В этом примере показано, как идентифицировать классы материалов конечных элементов, присутствующих в гиперспектральном изображении. Конечные элементы представляют собой чистую спектральную сигнатуру, которая обозначает характеристики отражения пикселей, принадлежащих одному поверхностному материалу. Существующие алгоритмы извлечения или идентификации конечных элементов извлекают или идентифицируют чистые пиксели в гиперспектральном изображении. Однако эти методы не идентифицируют имя материала или класс, которому принадлежит спектр конечных элементов. В этом примере можно извлечь сигнатуры конечных элементов, а затем классифицировать или идентифицировать класс материала конечных элементов в гиперспектральном изображении с помощью спектрального сопоставления.

В этом примере используется 1) спектральные сигнатуры в спектральной библиотеке ECOSTRESS в качестве эталонных спектров и 2) образец данных из набора данных Джаспера Риджа в качестве тестовых данных для идентификации материала конечного элемента.

Считывание справочных данных из спектральной библиотеки 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",...
             "water.tapwater.none.liquid.all.tapwater.jhu.becknic.spectrum.txt",...
             "water.ice.none.solid.all.ice_dat_.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.road.tar.solid.all.0099uuutar.jhu.becknic.spectrum.txt",...   
             "manmade.concrete.pavingconcrete.solid.all.0092uuu_cnc.jhu.becknic.spectrum.txt"];
lib = readEcostressSig(filenames);

Отображение lib данные и проверить их значения. Данные представляют собой структурную переменную, определяющую класс, подкласс, длину волны и информацию, связанную с отражательной способностью.

lib
lib=1×8 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
      ⋮

Постройте график спектральных сигнатур, считанных из спектральной библиотеки ECOSTRESS.

figure
hold on
for idx = 1:numel(lib)
    plot(lib(idx).Wavelength,lib(idx).Reflectance,'LineWidth',2);
end
axis tight
box on
xlabel('Wavelength (\mum)');
ylabel('Reflectance (%)');
classNames = {lib.Class};
legend(classNames,'Location','northeast')
title('Reference Spectra from ECOSTRESS Library');
hold off

Считывание тестовых данных

Считывание тестовых данных из набора данных Jasper Ridge с помощью hypercube функция. Функция возвращает hypercube объект, который хранит куб данных и метаданные, считанные из тестовых данных. Тестовые данные имеют 198 спектральных полос и их длины волн находятся в диапазоне от 399,4 нм до 2457 нм. Спектральное разрешение составляет до 9,9 нм, а пространственное разрешение каждого полосового изображения - 100 на 100. Данные испытания содержат четыре скрытых конечных элемента, которые включают дороги, почву, воду и деревья.

hcube = hypercube('jasperRidge2_R198.hdr');

Извлечь спектры конечных элементов

Для вычисления общего количества спектрально различных конечных элементов, присутствующих в тестовых данных, используйте countEndmembersHFC функция. Эта функция находит количество конечных элементов с помощью метода Харсаньи-Фаррана-Чанга (HFC). Установите низкое значение вероятности ложного аварийного сигнала (PFA), чтобы избежать ложных обнаружений.

numEndmembers = countEndmembersHFC(hcube,'PFA',10^-27);

Извлеките конечные элементы тестовых данных с помощью метода N-FINDR.

endMembers = nfindr(hcube,numEndmembers);

Считывание значений длины волны из hypercube объект hcube. Постройте график извлеченных сигнатур конечных элементов. Данные испытаний состоят из 4 материалов конечных элементов, и названия классов этих материалов могут быть идентифицированы посредством спектрального согласования.

figure
plot(hcube.Wavelength,endMembers,'LineWidth',2)
axis tight
xlabel('Wavelength (nm)')
ylabel('Data Values')
title('Endmembers Extracted using N-FINDR')
num = 1:numEndmembers;
legendName = strcat('Endmember',{' '},num2str(num'));
legend(legendName)

Определение материала конечного элемента

Чтобы определить имя материала конечного элемента, используйте spectralMatch функция. Функция вычисляет спектральное сходство между файлами библиотеки и спектром конечных элементов, подлежащим классификации. Выберите метод расхождения спектральной информации (SID) для вычисления показателя соответствия. Обычно низкое значение оценки SID означает лучшее согласование между тестовым и эталонным спектрами. Затем тестируемый спектр классифицируется как относящийся к классу наилучшего согласующегося эталонного спектра.

Например, чтобы идентифицировать класс материала третьего и четвертого конечных элементов, найдите спектральное сходство между сигнатурами библиотеки и соответствующим спектром конечных элементов. Индекс минимального значения оценки SID указывает имя класса в спектральной библиотеке. Третий спектр конечного элемента идентифицируется как Морская вода, а четвертый спектр конечного элемента идентифицируется как Дерево.

wavelength = hcube.Wavelength;
detection = cell(1,1);
cnt = 1;
queryEndmember = [3 4];
for num = 1:numel(queryEndmember)
    spectra = endMembers(:,queryEndmember(num));
    scoreValues = spectralMatch(lib,spectra,wavelength,'Method','sid');
    [~, matchIdx] = min(scoreValues);
    detection{cnt} = lib(matchIdx).Class;
    disp(strcat('Endmember spectrum ',{' '},num2str(queryEndmember(num)),' is identified as ',{' '},detection{cnt}))
    cnt=cnt+1;
end
Endmember spectrum 3 is identified as Sea Water
Endmember spectrum 4 is identified as Tree

Области конечных элементов сегмента в тестовых данных

Чтобы визуально проверить результаты идентификации, локализуйте и сегментируйте области изображения, специфичные для материалов конечных элементов, в тестовых данных. Используйте sid вычисляют пиксельное спектральное сходство между спектром пикселей и выделенным спектром конечных элементов. Затем выполните обработку порогов, чтобы сегментировать требуемые области конечных элементов в тестовых данных и сформировать сегментированное изображение. Выберите значение порога 15, чтобы выбрать наилучшие совпадающие пикселы.

Для визуализации создайте RGB-версию тестовых данных с помощью colorize и затем наложить сегментированное изображение на тестовое изображение.

threshold = 15;
rgbImg = colorize(hcube,'method','rgb','ContrastStretching',true);
overlayImg = rgbImg;
labelColor = {'Blue','Green'};
segmentedImg = cell(size(hcube.DataCube,1),size(hcube.DataCube,2),numel(queryEndmember));
for num = 1:numel(queryEndmember)
    scoreMap = sid(hcube,endMembers(:,queryEndmember(num)));
    segmentedImg{num} = scoreMap <= threshold;
    overlayImg = imoverlay(overlayImg,segmentedImg{num},labelColor{num});   
end

Показать результаты

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

figure('Position',[0 0 900 400])
plotdim = [0.02 0.2 0.3 0.7;0.35 0.2 0.3 0.7];
for num = 1:numel(queryEndmember)
    subplot('Position',plotdim(num,:))
    imagesc(segmentedImg{num})
    title(strcat('Segmented Endmember region :',{' '},detection{num}));
    colormap([0 0 0;1 1 1])
    axis off
end

figure('Position',[0 0 900 400])
subplot('Position',[0 0.2 0.3 0.7])
imagesc(rgbImg)
title('RGB Transformation of Test Data');
axis off
subplot('Position',[0.35 0.2 0.3 0.7])
imagesc(overlayImg)
title('Overlay Segmented Regions')
hold on
dim = [0.66 0.6 0.3 0.3];
annotation('textbox',dim,'String','Sea Water','Color',[1 1 1],'BackgroundColor',[0 0 1],'FitBoxToText','on');
dim = [0.66 0.5 0.3 0.3];
annotation('textbox',dim,'String','Tree','BackgroundColor',[0 1 0],'FitBoxToText','on');
hold off
axis off

Ссылки

[1] Крузе, Ф.А., А.Б. Лефкофф, Дж.У. Бордман, К.Б. Хайдебрехт, А.Т. Шапиро, П.Дж. Барлоон и А.Ф.Х. Гетц. «Система обработки спектральных изображений (SIPS) - интерактивная визуализация и анализ данных спектрометра визуализации». Дистанционное зондирование окружающей среды 44, № 2-3 (май 1993 года): 145-63. https://doi.org/10.1016/0034-4257 (93) 90013-N.

См. также

| | | |

Связанные темы