В этом примере показано, как идентифицировать типы участков растительности на гиперспектральном изображении с помощью интерактивного порогового значения нормализованной карты индекса различий растительности (NDVI). Карта NDVI гиперспектрального набора данных указывает плотность растительности в различных областях гиперспектральных данных. Значение NDVI вычисляется с использованием изображений ближней инфракрасной области (NIR) и видимой красной (R) спектральной полосы из гиперспектрального куба данных.
+ 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);
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. Гринбелт, SP-351 НАСА, Вашингтон, округ Колумбия, 1973 год.
[2] Хабудан, Д. «Гиперспектральные индексы растительности и новые алгоритмы прогнозирования зеленого LAI пологов сельскохозяйственных культур: моделирование и валидация в контексте точного земледелия». Дистанционное зондирование окружающей среды 90, № 3 (15 апреля 2004 года): 337-52. https://doi.org/10.1016/j.rse.2003.12.013.
colorize | hypercube | labeloverlay | uifigure | uipanel | uislider