Этот пример показывает, как классифицировать пиксели в гиперспектральном изображении с помощью алгоритма классификации спектрального преобразования углов (SAM). Этот алгоритм классифицирует каждый пиксель в тестовых данных путем вычисления счета спектрального соответствия между спектром пикселя и чистыми спектральными сигнатурами, считанными из спектральной библиотеки ECOSTRESS. Этот пример использует выборку данных из набора данных Jasper Ridge в качестве тестовых данных. Тестовые данные содержат четыре латентных конечных элемента, состоящих из дорог, почвы, воды и деревьев. В этом примере вы будете:
Сгенерируйте карту счета для различных областей, присутствующих в тестовых данных, путем вычисления счета спектрального соответствия SAM между спектром каждого тестового пикселя и чистым спектром. Чистые спектры получены из спектральной библиотеки ECOSTRESS.
Классифицируйте области с помощью минимальных критериев оценки и назначьте метку класса для каждого пикселя тестовых данных.
Считайте тестовые данные из набора данных Jasper Ridge при помощи hypercube
функция. Функция возвращает hypercube
объект, который хранит кубик гиперспектральных данных и коррозионную длину волны и информацию о метаданных, считанных из тестовых данных. Тестовые данные имеют 198 спектральные полосы, и их длины волн варьируются от 399,4 нм до 2457 нм. Спектральное разрешение до 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, пиксель полностью состоит из этого материала с одной поверхностью. Библиотека представляет собой компиляцию из более чем 3400 спектральных сигнатур как для натуральных, так и для техногенных материалов. Поскольку вы знаете, что конечные элементы латентны в тестовых данных, выберите файлы спектральной библиотеки ECOSTRESS, связанные с этими четырьмя конечными элементами.
Чтение спектральных файлов, связанных с водой, растительностью, почвой и бетоном, из спектральной библиотеки ECOSTRESS. Используйте спектральные сигнатуры этих типов:
Manmade для классификации дорог и дорожных сооружений
Грунт для классификации песчаных алевритовых и глинистых областей
Растительность для классификации древовидных областей
Вода для классификации водных областей
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] 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
| hypercube
| readEcostressSig
| spectralMatch