В этом примере показано, как идентифицировать различные области в гиперспектральном изображении, выполняя классификацию максимальной плотности (MAC). Карта изобилия характеризует распределение конечного элемента по гиперспектральному изображению. Каждый пиксель в изображении представляет собой либо чистый пиксель, либо смешанный пиксель. Набор значений плотности, полученных для каждого пикселя, представляет процент каждого конечного элемента, присутствующего в этом пикселе. В этом примере можно классифицировать пикселы в гиперспектральном изображении, найдя максимальное значение плотности для каждого пикселя и назначив его связанному классу конечных элементов.
В этом примере в качестве тестовых данных используется образец данных из набора данных Университета Павии. Данные испытаний содержат девять конечных элементов, представляющих эти классы наземной истины: асфальт, луга, гравий, деревья, окрашенные металлические листы, голый грунт, битум, самоблокирующиеся кирпичи и тени.
Загрузить .mat файл, содержащий тестовые данные, в рабочую область. .mat файл содержит массив paviaU, представляющий гиперсектральный куб данных и матрицу signatures, представляя девять сигнатур конечных элементов, взятых из гиперспектральных данных. Куб данных имеет 103 спектральных полосы с длинами волн от 430 нм до 860 нм. Геометрическое разрешение составляет 1,3 метра, а пространственное разрешение каждого изображения полосы - 610 на 340.
load('paviaU.mat');
image = paviaU;
sig = signatures;Вычисляют центральную длину волны для каждого спектрального диапазона путем равномерного разнесения диапазона длин волн по числу спектральных диапазонов.
wavelengthRange = [430 860]; numBands = 103; wavelength = linspace(wavelengthRange(1),wavelengthRange(2),numBands);
Создать hypercube объект с использованием гиперспектрального куба данных и центральных длин волн. Затем оцените изображение RGB по гиперспектральным данным. Установите ContrastStretching значение параметра для true для улучшения контрастности выходных данных RGB. Визуализация изображения RGB.
hcube = hypercube(image,wavelength); rgbImg = colorize(hcube,'Method','RGB','ContrastStretching',true); figure imshow(rgbImg)

Данные теста содержат сигнатуры конечных элементов девяти классов истинности земли. Каждый столбец sig содержат сигнатуру конечного элемента базового класса истинности. Создайте таблицу, содержащую имя класса для каждого конечного элемента и соответствующий столбец sig.
num = 1:size(sig,2);
endmemberCol = num2str(num');
classNames = {'Asphalt';'Meadows';'Gravel';'Trees';'Painted metal sheets';'Bare soil';...
'Bitumen';'Self blocking bricks';'Shadows'};
table(endmemberCol,classNames,'VariableName',{'Column of sig';'Endmember Class Name'})ans=9×2 table
Column of sig Endmember Class Name
_____________ ________________________
1 {'Asphalt' }
2 {'Meadows' }
3 {'Gravel' }
4 {'Trees' }
5 {'Painted metal sheets'}
6 {'Bare soil' }
7 {'Bitumen' }
8 {'Self blocking bricks'}
9 {'Shadows' }
Постройте график подписей конечных элементов.
figure plot(sig) xlabel('Band Number') ylabel('Data Values') ylim([400 2700]) title('Endmember Signatures') legend(classNames,'Location','NorthWest')

Создание карт изобилия конечных элементов с помощью estimateAbundanceLS и выберите метод как полные ограниченные наименьшие квадраты (FCLS). Функция выводит карты плотности в виде массива 3-D с пространственными размерами в качестве входных данных. Каждый канал - это карта изобилия конечного элемента из соответствующего столбца подписей. В этом примере пространственная размерность входных данных равна 610 на 340, а число конечных элементов равно 9. Так, размер выходной карты изобилия составляет 610-на-340-на-9.
abundanceMap = estimateAbundanceLS(hcube,sig,'Method','fcls');
Отображение карт изобилия.
fig = figure('Position',[0 0 1100 900]); n = ceil(sqrt(size(abundanceMap,3))); for cnt = 1:size(abundanceMap,3) subplot(n,n,cnt) imagesc(abundanceMap(:,:,cnt)) title(['Abundance of ' classNames{cnt}]) hold on end hold off

Найдите номер канала наибольшего значения плотности для каждого пикселя. Номер канала, возвращаемый для каждого пикселя, соответствует столбцу в sig который содержит сигнатуру конечного элемента, связанную с максимальным значением изобилия этого пикселя. Отображение цветного закодированного изображения пикселей, классифицированных по максимальному значению плотности.
[~,matchIdx] = max(abundanceMap,[],3);
figure
imagesc(matchIdx)
colormap(jet(numel(classNames)))
colorbar('TickLabels',classNames)
Сегментируйте классифицированные области и наложите каждую из них на изображение RGB, оцененное из гиперспектрального куба данных.
segmentImg = zeros(size(matchIdx)); overlayImg = zeros(size(abundanceMap,1),size(abundanceMap,2),3,size(abundanceMap,3)); for i = 1:size(abundanceMap,3) segmentImg(matchIdx==i) = 1; overlayImg(:,:,:,i) = imoverlay(rgbImg,segmentImg); segmentImg = zeros(size(matchIdx)); end
Отображение классифицированной и наложенной областей гиперспектрального изображения вместе с именами классов. На снимках видно, что точно классифицированы асфальт, деревья, голый грунт, кирпичные области.
figure('Position',[0 0 1100 900]); n = ceil(sqrt(size(abundanceMap,3))); for cnt = 1:size(abundanceMap,3) subplot(n,n,cnt); imagesc(uint8(overlayImg(:,:,:,cnt))); title(['Regions Classified as ' classNames{cnt}]) hold on end hold off

colorize | estimateAbundanceLS | hypercube