Обсудить в форуме Комментариев 12Редактировать в вики
Пример решения технических задач, возникающих при выявлении изменений отражательных свойств поверхности по разновременным материалам ДЗЗ.
Одним из способов выявления изменений между сериями разновременных снимков является проведение различных математических операций между значениями яркости пикселей. Настоящая статья создана с целью помочь начинающим пользователям освоить основы техники данного приема с использованием свободного ПО и является личным опытом автора. Для примера (результат на рис. 1) выбрана достаточно простая практическая задача и соответствующие ей исходные данные.
ОС Windows 7, Python 2.7.*, GDAL 1.11.1, QGIS 2.14.2.
Зимние безоблачные снимки Landsat 8 OLI, панхроматический(_B8) канал одной сцены, формат TIF, уровень обработки L1T в проекции UTM (отмечу, что для моего региона в средней полосе европейской части России удалось найти по 1 такому снимку за весь период работы сенсора (с апреля 2013 г.) за период февраль-март 2015 и 2016 г.).
Участки, вырубленные за период между датами съемок, на более позднем снимке будут иметь значительно большие значения яркости, чем на раннем (при условии наличия снежного покрова и не слишком большого временного интервала). Расчет разности яркости и последующая классификация результата по пороговому значению осуществляется с использованием утилиты gdal_calc.py. Естественно, в результат попадут все пиксели, значительно увеличившие свою яркость по разным причинам, но в подавляющем большинстве (если речь идет о лесной зоне) это будут именно изменения, связанные с исчезновением лесного покрова (в частности, сплошные рубки, приводящие к полному исчезновению древостоя).
Вопросы радиометрической калибровки достаточно полно рассмотрены в статье http://gis-lab.info/qa/landsat-data-correction.html, учитывая особенности исходных данных выбранных в качестве примера, калибровку проводить не обязательно(если не нужна разность в физических единицах), поэтому все команды приведены для расчетов в DN. Радиометрическую калибровку можно также осуществить с помощью gdal_calc.py, руководствуясь указанной выше статьей.
Для корректной работы утилиты gdal_calc.py с несколькими растрами необходимо, чтобы входящие растры имели одинаковый охват (экстент). Получить сведения об охвате можно, используя утилиту gdalinfo:
gdalinfo rastr
Результат работы утилиты будет представлен в виде вывода командной строки:
Необходимо выбрать максимальные значения для левой и нижней границ и минимальные значения для правой и верхней границ среди охватов всех используемых изображений.
Обрезка растров производится с помощью утилиты gdalwarp:
gdalwarp.exe -te Xmin Ymin Xmax Ymax -tr Xres Yres inputRastr outputRastr
Для получения правильного результата необходимо также, чтобы корректные значения яркости одного растра не попадали на значения NODATA (в данном примере 0) другого, т.е. получить область пересечения растров. Данную операцию необходимо провести для каждого из растров, приведенных к одинаковому охвату, используя утилиту gdal_calc.py:
gdal_calc.py -A inpRastr1 -B inpRastr2 --outfile=outRastr1 --calc="A*(A>0)*(B>0)" --NoDataValue=0 gdal_calc.py -A inpRastr1 -B inpRastr2 --outfile=outRastr2 --calc="B*(A>0)*(B>0)" --NoDataValue=0
Замечание: Для запуска утилит GDAL может понадобится указание полного пути к интерпретатору Python, например:
C:\Python27\python.exe "C:\Program Files\GDAL\gdal_calc.py" (пути с пробелами берутся в кавычки)
Если имеется полигон обрезки, включающий только корректные значения во всех изображениях (например, лист разграфки WRS-2), можно сразу обрезать исходные растры:
gdalwarp.exe -te Xmin Ymin Xmax Ymax -tr Xres Yres -dstnodata 0 -cutline shpfile inpRast outRast
Во избежание пересчета пикселей при трансформации выходной растр необходимо замкнуть на сетку Landsat, используя параметры gdalwarp -te и -tr. Можно использовать значения -te для минимального охвата, как указано выше, или вычислить самостоятельно для полигона обрезки.
Полигон обрезки и растры должны иметь одинаковую систему координат.
Теперь можно провести вычисление собственно разности каналов:
gdal_calc -A earlyRast -B laterRast --outfile=outRast --calc="B.astype(int)-A.astype(int)" --type "Int32"
Для выявления непосредственно вырубок как объектов необходимо классифицировать полученный одноканальный растр разности на два класса: 1) пиксели с изменением яркости, соответствующим вырубке; 2) все остальные пиксели.
gdal_calc.py -A inpRast --outfile=outRast --calc="1*(A>value)" --type "Byte"
Погрешности в геометрической привязке снимков, а также особенности снегонакопления на границе различных категорий земель могут привести к ошибочному отнесению к вырубкам участков вдоль линейных объектов (рек, дорог, лесополос) и по берегам водоемов (рис. 2).
Уменьшить количество "нежелательных" пикселей, а также заполнить "пустоты" в полигонах можно с помощью фильтра-утилиты gdal_sieve.py:
gdal_sieve.py -st value -4 inpRast outRast
Преобразовать классифицированные данные в векторный формат можно с помощью утилиты gdal_polygonize.py, но прежде, для того чтобы не создавать полигоны для значений отнесенных к не интересующему классу, удобно будет установить флаг NODATA дополнительно на значения 0 и 255 поэтапно:
gdalwarp.exe -dstnodata value inpRast outRast
Собственно конвертация в вектор:
gdal_polygonize.py inpRast -f "ESRI Shapefile" outShp layer
Векторные данные, иллюстрирующие результат, были получены дополнительной обработкой вектора инструментом геообработки QGIS "Упростить геометрию".
Следует заметить, что делянки, вырубленные незадолго до более поздней съемки, определяются плохо, т.к. они покрыты порубочными остатками и разница в яркости может оказаться ниже установленного порогового значения.
Обсудить в форуме Комментариев 12Редактировать в вики
Последнее обновление: 2016-11-17 10:03
Дата создания: 31.05.2016
Автор(ы): gornak
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).