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