Гиперспектральный анализ изображений с использованием классификации максимальной численности

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

Этот пример использует выборку данных из набора данных Университета Павии в качестве тестовых данных. Тестовые данные содержат девять членов, которые представляют эти классы основной истины: Асфальт, Луга, Гравий, Деревья, Окрашенные металлические листы, Голая почва, Битум, Самоблокирующиеся кирпичи и Тени.

Загрузка и визуализация данных

Загрузите .mat файл, содержащий тестовые данные в рабочую область. The .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)

Figure contains an axes. The axes contains an object of type image.

Тестовые данные содержат подписи конечных элементов девяти классов основной истины. Каждый столбец 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')

Figure contains an axes. The axes with title Endmember Signatures contains 9 objects of type line. These objects represent Asphalt, Meadows, Gravel, Trees, Painted metal sheets, Bare soil, Bitumen, Self blocking bricks, Shadows.

Оценка численности карт

Создайте карты изобилия для конечных элементов с помощью estimateAbundanceLS и выберите метод как полные методы наименьших квадратов с ограничениями (FCLS). Функция выводит карты численности как трехмерный массив с пространственными размерностями в качестве входных данных. Каждый канал является обильной картой конечного члена из соответствующего столбца сигнатур. В этом примере пространственная размерность входных данных составляет 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

Figure contains 9 axes. Axes 1 with title Abundance of Asphalt contains an object of type image. Axes 2 with title Abundance of Meadows contains an object of type image. Axes 3 with title Abundance of Gravel contains an object of type image. Axes 4 with title Abundance of Trees contains an object of type image. Axes 5 with title Abundance of Painted metal sheets contains an object of type image. Axes 6 with title Abundance of Bare soil contains an object of type image. Axes 7 with title Abundance of Bitumen contains an object of type image. Axes 8 with title Abundance of Self blocking bricks contains an object of type image. Axes 9 with title Abundance of Shadows contains an object of type image.

Выполните классификацию максимальной численности

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

[~,matchIdx] = max(abundanceMap,[],3);
figure
imagesc(matchIdx)
colormap(jet(numel(classNames)))
colorbar('TickLabels',classNames)

Figure contains an axes. The axes contains an object of type image.

Сегментируйте классифицированные области и наложите каждую из них на изображение 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

Figure contains 9 axes. Axes 1 with title Regions Classified as Asphalt contains an object of type image. Axes 2 with title Regions Classified as Meadows contains an object of type image. Axes 3 with title Regions Classified as Gravel contains an object of type image. Axes 4 with title Regions Classified as Trees contains an object of type image. Axes 5 with title Regions Classified as Painted metal sheets contains an object of type image. Axes 6 with title Regions Classified as Bare soil contains an object of type image. Axes 7 with title Regions Classified as Bitumen contains an object of type image. Axes 8 with title Regions Classified as Self blocking bricks contains an object of type image. Axes 9 with title Regions Classified as Shadows contains an object of type image.

См. также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте