Гиперспектральный анализ изображения Используя максимальную классификацию распространенностей

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

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

Загрузите и визуализируйте данные

Загрузите .mat файл, содержащий тестовые данные в рабочую область. .mat файл содержит массив paviaU, представление гиперспектрального куба данных и матричного signatures, представление девяти endmember подписей, взятых из гиперспектральных данных. Куб данных имеет 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)

Тестовые данные содержат endmember подписи девяти классов основной истины. Каждый столбец sig содержите endmember подпись класса основной истины. Составьте таблицу, которая перечисляет имя класса для каждого endmember и соответствующего столбца 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'             }

Постройте endmember подписи.

figure
plot(sig)
xlabel('Band Number')
ylabel('Data Values')
ylim([400 2700])
title('Endmember Signatures')
legend(classNames,'Location','NorthWest')

Оцените карты распространенности

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

[~,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

Смотрите также

| |

Похожие темы

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