В этом примере показано, как идентифицировать типы областей растительностей в гиперспектральном изображении посредством интерактивной пороговой обработки карты нормированного индекса растительности различия (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 в рабочую область. Этот пример использует выборку данных от набора данных Павии, который содержит и растительность и бесплодные области.
hcube = hypercube('paviaU.dat','paviaU.hdr');
Вычислите значение NDVI для каждого пикселя в кубе данных при помощи ndvi
функция. Функциональные выходные параметры 2D изображение, в котором значение каждого пикселя является значением 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);
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] Дж.В. Раус, Р.Х. Хэсс, Дж.А. Шелл и Д.В. Диринг. “Контролируя Системы Растительности в Великих равнинах с ERTS”. В Продолжениях Третьего Технологического Спутника Земных ресурсов - 1 Симпозиум, 1:309–17. Зеленая зона, NASA SP-351, Вашингтон, округ Колумбия, 1973.
[2] Haboudane, D. “Гиперспектральные индексы Растительности и Новые Алгоритмы для Предсказания Зеленого LAI Навесов Обрезки: Моделирование и Валидация в Контексте Сельского хозяйства Точности”. Дистанционное зондирование Среды 90, № 3 (15 апреля 2004): 337–52. https://doi.org/10.1016/j.rse.2003.12.013.
hypercube
| colorize
| uifigure
| uipanel
| uislider
| labeloverlay