В этом примере показано, как идентифицировать различные области в гиперспектральном изображении путем выполнения максимальной классификации распространенностей (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
colorize
| estimateAbundanceLS
| hypercube