В этом примере показано, как идентифицировать классы материалов конечных элементов, присутствующих в гиперспектральном изображении. Конечные элементы являются чистой спектральной сигнатурой, которая сигнализирует отражательные характеристики пикселей, принадлежащих одному поверхностному материалу. Существующие алгоритмы извлечения или идентификации конечных элементов извлекают или идентифицируют чистые пиксели в гиперспектральном изображении. Однако эти методы не идентифицируют имя материала или класс, к которому относится спектр конечного члена. В этом примере вы извлечете сигнатуры конечного элемента, а затем, классифицируете или идентифицируете класс материала конечного элемента в гиперспектральном изображении с помощью спектрального согласования.
Этот пример использует 1) спектральные сигнатуры в спектральной библиотеке ECOSTRESS в качестве эталонных спектров и 2) выборку данных из набора данных хребта Джаспера в качестве тестовых данных для идентификации материала конечного элемента.
Добавьте полный путь к файлу, содержащему файлы библиотеки 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
данные и осмотр их значений. Данные являются struct переменной, задающей класс, подкласс, длину волны и информацию, связанную с отражением.
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
функция. Эта функция находит количество конечных элементов с помощью метода Harsanyi-Farrand-Chang (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] Kruse, F.A., A.B. Lefkoff, J.W. Boardman, K.B. Heidebrecht, A.T. Shapiro, P.J. Barloon и A.F.H. Гетц. «Система спектральной обработки изображений (SIPS) - интерактивная визуализация и анализ данных спектрометра визуализации». Дистанционное зондирование окружения 44, № 2-3 (май 1993 года): 145-63. https://doi.org/10.1016/0034-4257 (93) 90013-N.
colorize
| countEndmembersHFC
| hypercube
| readEcostressSig
| spectralMatch