Этот пример показов, как идентифицировать типы областей растительности в гиперспектральном изображении посредством интерактивного порога нормализованной карты индекса различия растительности (NDVI). Карта NDVI гиперспектрального набора данных указывает плотность растительности в различных областях гиперспектральных данных. Значение NDVI вычисляют с использованием спектральных изображений ближнего инфракрасного (NIR) и видимой красной (R) полосы из куба гиперспектральных данных.
Значение NDVI пикселя является скаляром от -1 до 1. Пиксели в областях со здоровой или плотной растительностью отражают больше света NIR, что приводит к высоким значениям NDVI. Пиксели в областях с нездоровой растительностью или бесплодной землей поглощают больше света NIR, что приводит к низким или отрицательным значениям NDVI. Исходя из значения NDVI, можно определить растительность в области как плотную растительность, умеренную растительность, разреженную растительность или отсутствие растительности. Это типичная область значений значений NDVI для каждого типа области:
Плотная растительность - Больше чем или равно 0,6
Умеренная растительность - в области значений [0,4, 0,6)
Разреженная растительность - в области значений [0,2 0,4)
Без растительности - Ниже 0.2
Сегментировать желаемые области растительности можно путем выполнения порогового значения с помощью значений NDVI. В этом примере вы будете в интерактивном режиме выбирать и изменять пороговые значения, чтобы идентифицировать различные области растительности в кубе гиперспектральных данных на основе их значений NDVI.
Считывайте гиперспектральные данные из файла формата ENVI в рабочую область. В этом примере используется выборка данных из набора данных Pavia, которая содержит как растительные, так и бесплодные области.
hcube = hypercube('paviaU.dat','paviaU.hdr');
Вычислите значение NDVI для каждого пикселя в кубе данных с помощью ndvi
функция. Функция выводит 2-D изображение, в котором значение каждого пикселя является значением NDVI для соответствующего пикселя в кубе гиперспектральных данных.
ndviImg = ndvi(hcube);
Идентифицируйте различные области в гиперспектральных данных с помощью многоуровневого порога. Задайте матрицу меток, чтобы назначить значения меток пикселям на основе заданных пороговых значений. Можно задать пороги на основе вычисленных значений NDVI.
Пометьте значение 1
- Задайте пороговое значение 0,6 и найдите пиксели со значениями NDVI, большими или равными порогу. Это плотные пиксели растительности.
Пометьте значение 2
- Задайте нижний пороговый предел 0,4 и верхний пороговый предел 0,6. Найдите пиксели со значениями NDVI, большими или равными 0,4 и меньше 0,6. Это умеренные пиксели растительности.
Пометьте значение 3
- Задайте нижний пороговый предел 0,2 и верхний пороговый предел 0,4. Найдите пиксели со значениями NDVI, большими или равными 0,2 и меньше 0,4. Это разреженные пиксели растительности.
Пометьте значение 4
- Задайте пороговое значение 0,2 и найдите пиксели со значениями NDVI меньше, чем порог. Это не пиксели растительности.
L = zeros(size(ndviImg)); L(ndviImg >= 0.6) = 1; L(ndviImg >= 0.4 & ndviImg < 0.6) = 2; L(ndviImg >= 0.2 & ndviImg < 0.4) = 3; L(ndviImg < 0.2) = 4;
Оцените растянутое на контраст изображение RGB из исходного куба данных с помощью colorize
функция.
rgbImg = colorize(hcube,'Method','rgb','ContrastStretching',true);
Задайте палитру, чтобы отобразить каждое значение в матрице меток в другом цвете. Наложите матрицу меток на изображение RGB.
cmap = [0 1 0; 0 0 1; 1 1 0; 1 0 0];
overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap);
Чтобы создать интерактивный интерфейс, сначала создайте окно рисунка с помощью uifigure
функция. Затем добавьте две панели к окну рисунка для отображения входа изображения и наложенного изображения один за другим.
h = uifigure('Name','Interactive NDVI Thresholding','Position',[200,50,1000,700]); viewPanel1 = uipanel(h,'Position',[2 220 400 450],'Title','Input Image'); ax1 = axes(viewPanel1); image(rgbImg,'Parent',ax1) viewPanel2 = uipanel(h,'Position',[400 220 400 450],'Title','Types of Vegetation Regions in Input Image'); ax2 = axes(viewPanel2); image(overlayImg,'Parent',ax2)
Аннотируйте окно рисунка цветом для каждой метки и связанной с ней плотностью растительности. Значение палитры для плотной растительности зелёное, умеренная растительность синяя, редкая растительность жёлтая, растительность красная.
annotation(h,'rectangle',[0.82 0.82 0.03 0.03],'Color',[0 1 0],'FaceColor',[0 1 0]); annotation(h,'rectangle',[0.82 0.77 0.03 0.03],'Color',[0 0 1],'FaceColor',[0 0 1]); annotation(h,'rectangle',[0.82 0.72 0.03 0.03],'Color',[1 1 0],'FaceColor',[1 1 0]); annotation(h,'rectangle',[0.82 0.67 0.03 0.03],'Color',[1 0 0],'FaceColor',[1 0 0]); annotation(h,'textbox',[0.85 0.80 0.9 0.05],'EdgeColor','None','String','Dense Vegetation'); annotation(h,'textbox',[0.85 0.75 0.9 0.05],'EdgeColor','None','String','Moderate Vegetation'); annotation(h,'textbox',[0.85 0.70 0.9 0.05],'EdgeColor','None','String','Sparse Vegetation'); annotation(h,'textbox',[0.85 0.65 0.9 0.05],'EdgeColor','None','String','No Vegetation');
Создайте ползунки для интерактивного изменения порогов. Использование uislider
функция для добавления ползунка для регулировки минимального порогового значения и ползунка для регулировки максимального порогового значения.
slidePanel1 = uipanel(h,'Position',[400,120,400,70],'Title','Minimum Threshold Value'); minsld = uislider(slidePanel1,'Position',[30,40,350,3],'Value',-1,'Limits',[-1 1],'MajorTicks',-1:0.4:1); slidePanel2 = uipanel(h,'Position',[400,30,400,70],'Title','Maximum Threshold Value'); maxsld = uislider(slidePanel2,'Position',[30,35,350,3],'Value',1,'Limits',[-1 1],'MajorTicks',-1:0.4:1);
Используйте функцию ndviThreshold
для изменения минимального и максимального пороговых пределов. Когда вы перемещаете ползунок и отпускаете кнопку мыши, ValueChangedFcn
коллбэк обновляет значение ползунка и устанавливает значение ползунка в качестве нового порога. Вы должны вызвать ndviThreshold
функция отдельно для минимального порогового ползунка и максимального порогового ползунка. Измените пороговые пределы путем настройки ползунков. Это позволяет вам проверить типы областей растительности в пределах заданных пороговых пределов.
minsld.ValueChangedFcn = @(es,ed) ndviThreshold(minsld,maxsld,ndviImg,rgbImg,ax2,cmap); maxsld.ValueChangedFcn = @(es,ed) ndviThreshold(minsld,maxsld,ndviImg,rgbImg,ax2,cmap);
The ndviThreshold
функция генерирует новую матрицу меток с помощью обновленных пороговых значений и динамически обновляет наложенное изображение в окне рисунка.
Создайте функцию обратного вызова
Создайте функцию обратного вызова, чтобы в интерактивном режиме изменить пороговые пределы и динамически обновлять результаты.
function ndviThreshold(minsld,maxsld,ndviImg,rgbImg,ax2,cmap) L = zeros(size(ndviImg)); minth = round(minsld.Value,2); maxth = round(maxsld.Value,2); if minth > maxth error('Minimum threshold value must be less than the maximum threshold value') end if minth >= 0.6 % Label 1 for Dense Vegetation L(ndviImg >= minth & ndviImg <= maxth) = 1; overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap); elseif minth >= 0.4 && minth < 0.6 % Label 1 for Dense Vegetation % Label 2 for Moderate Vegetation if maxth >= 0.6 L(ndviImg >= minth & ndviImg < 0.6) = 2; L(ndviImg >= 0.6 & ndviImg <= maxth) = 1; else L(ndviImg >= minth & ndviImg < maxth) = 2; end overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap); elseif minth >= 0.2 && minth <0.4 % Label 1 for Dense Vegetation % Label 2 for Moderate Vegetation % Label 3 for Sparse vegetation if maxth < 0.4 L(ndviImg >= minth & ndviImg <= maxth) = 3; elseif maxth >=0.4 && maxth < 0.6 L(ndviImg >= minth & ndviImg < 0.4) = 3; L(ndviImg >= 0.4 & ndviImg <= maxth) = 2; elseif maxth >= 0.6 L(ndviImg >= minth & ndviImg < 0.4) = 3; L(ndviImg >= 0.4 & ndviImg < 0.6) = 2; L(ndviImg >= 0.6 & ndviImg <= maxth) = 1; end overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap); elseif minth < 0.2 % Label 1 for Dense Vegetation % Label 2 for Moderate Vegetation % Label 3 for Sparse vegetation % Label 4 for No Vegetation L(ndviImg >= minth & ndviImg < 0.2) = 4; if maxth >= 0.6 L(ndviImg >= 0.6 & ndviImg <= maxth) = 1; L(ndviImg >= 0.4 & ndviImg < 0.6) = 2; L(ndviImg >= 0.2 & ndviImg < 0.4) = 3; elseif maxth >=0.4 && maxth < 0.6 L(ndviImg >= 0.4 & ndviImg <= maxth) = 2; L(ndviImg >= 0.2 & ndviImg < 0.4) = 3; elseif maxth >=0.2 && maxth < 0.4 L(ndviImg >= maxth & ndviImg < 0.4) = 3; end overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap); elseif minth == maxth if maxth < 0.2 L(ndviImg == minth) = 4; elseif maxth >=0.4 && maxth < 0.6 L(ndviImg == maxth) = 2; elseif maxth >=0.2 && maxth < 0.4 L(ndviImg == maxth) = 3; elseif maxth >= 0.6 L(ndviImg == maxth) = 1; end overlayImg = labeloverlay(rgbImg,L,'Colormap',cmap); end % Display the overlay image. image(overlayImg,'parent',ax2); % Store updated labelled image minsld.UserData = L; maxsld.UserData = L; end
[1] J.W. Rouse, R.H. Hass, J.A. Schell и D.W. Deering. Мониторинг систем растительности на Великих равнинах с ERTS. В трудах третьего спутника технологии Земных ресурсов - 1 симпозиум, 1: 309-17. Гринбельт, SP-351 НАСА, Вашингтон, округ Колумбия, 1973.
[2] Haboudane, D «. Гиперспектральные индексы растительности и новые алгоритмы предсказания зеленого LAI полог сельскохозяйственных культур: моделирование и валидация в контексте точного сельского хозяйства». Дистанционное зондирование окружения 90, № 3 (15 апреля 2004 года): 337-52. https://doi.org/10.1016/j.rse.2003.12.013.
colorize
| hypercube
| labeloverlay
| uifigure
| uipanel
| uislider