В этом примере показано, как классифицировать пиксели на гиперспектральное изображение при помощи алгоритма классификации спектральных угловых картопостроителей (SAM). Этот алгоритм классифицирует каждый пиксель на тестовые данные путем вычисления спектрального счета соответствия между спектром пикселя и чистыми спектральными подписями, считанными из спектральной библиотеки ECOSTRESS. Этот пример использует выборку данных от набора данных Jasper Ridge как тестовые данные. Тестовые данные содержат четыре endmembers скрытых, состоя из дорог, почвы, воды и деревьев. В этом примере вы будете:
Сгенерируйте карту счета для различных областей, существующих в тестовых данных путем вычисления спектрального счета соответствия SAM между спектром каждого тестового пикселя и чистым спектром. Чистые спектры от спектральной библиотеки ECOSTRESS.
Классифицируйте области при помощи минимальных критериев счета и присвойте метку класса для каждого пикселя в тестовых данных.
Данные о тесте чтения из набора данных 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, пиксель состоит полностью из того одного поверхностного материала. Библиотека является компиляцией более чем 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 Н.
hypercube
| colorize
| readEcostressSig
| spectralMatch