Спутник ДЗЗ
3.58K subscribers
2.7K photos
148 videos
203 files
2.45K links
Человеческим языком о дистанционном зондировании Земли.

Обратная связь: @sputnikDZZ_bot
加入频道
Forwarded from the Glimpses
🦉 Длинохвостая неясыть пережидает снегопад.
Чем заняться в снегопад, если ты неясыть? Дремать, стряхивать снежинки и, конечно же, кривляться для фотографов 🙂
📍 Санкт-Петербург, Елагин остров, ЦПKиО
📷 @the_glimpses
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
GEE-18. Маскирование облаков: первое знакомство

До сих пор облака на снимках мы игнорировали. Старались выбирать снимки, где облаков мало или нет совсем. Но при таком подходе пропадает много данных, которые можно было бы использовать, удалив из них облака. Этим мы сейчас и займемся.

Спешу расстроить (или обрадовать?), но проблема маскирования облачности до сих пор полностью не решена. Существует много рабочих подходов, но все они допускают ошибки (пропускают облака, путают с облаками яркие отсветы искусственных объектов и т. п.). Трудно встретить специалиста, работающего с оптическими снимками, который был бы доволен применяемой им маской облаков. Но теорию мы рассмотрим позже, сейчас займемся применением готовых масок.

Вместе со снимками Sentinel-2 Surface Reflectance поставляется сразу два вида масок. Их мы и рассмотрим.

Код примера: https://code.earthengine.google.com/467bda21cbbfe7030597c8f242ef9cd8

Маска качества данных QA60 досталась в наследство от данных 1-го уровня обработки (Sentinel-2 L1C). Алгоритм ее построения описан здесь. “60” в имени маски — это ее пространственное разрешение (60 м). Маска QA60 — битовая. Бит 10 в ней отвечает за непрозрачные облака: если он равен 0, то облаков нет, если 1 — облака есть. Бит 11 отвечает за тонкие перистые облака или cirrus (с разными видами облаков можно познакомиться здесь).

Возьмем маску качества и построим слои clouds и cirrus, состоящие только из чистых пикселей, в которых облака и cirrus отсутствуют (по “мнению” QA60, разумеется). Используя полученные слои в качестве масок, удалим оба вида облаков:

var QA = image.select("QA60");

var clouds = QA.bitwiseAnd(Math.pow(2, 10)).eq(0);
var cirrus = QA.bitwiseAnd(Math.pow(2, 11)).eq(0);

// Снимок с удаленными облаками.
var image_qa60 = image.updateMask(clouds).updateMask(cirrus);

Чтобы показать на карте только облака, инвертируем маску clouds (напомним, что она состоит из безоблачных пикселей):

Map.addLayer(clouds.not().selfMask(),{palette: ['blue']}, "QA60 Cloud mask", false);

Маска QA60 — простая, считается быстро, но дает посредственное качество удаления облаков.

#GEE
Облака показаны синим цветом, а cirrus — оранжевым.

Справа на снимке находятся две горы, покрытые снегом. Они помогают проверить способность алгоритмов удаления облачности различать облака и снег.
Маски MSK_CLDPRB (Cloud Probability Map) и SCL (ScenCLassification Table) появились уже в продуктах Sentinel-2 SR, то есть в данных 2-го уровня обработки (подробности здесь). Значения MSK_CLDPRB дают вероятность того, что в соответствующем пикселе находится облако.

Выделим пиксели, вероятность облачности которых меньше 5%:

var cloudProb = image.select('MSK_CLDPRB');
var cloudsSR = cloudProb.lt(5);

Расположение сirrus описано в маске SCL. Это — карта, разбивающая пиксели снимка на классы. Каждому классу соответствует свое значение https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR#bands на карте SCL. Перистым облакам соответствует значение SCL=10, теням от облаков — SCL=3. В QA60 теней облаков не было, сейчас отмаскируем и их:

var scl = image.select('SCL');
var cirrusSR = scl.eq(10); // 10 = cirrus
var shadowSR = scl.eq(3); // 3 = cloud shadow

// Маскируем облака, cirrus и тени.
var image_SR = image.updateMask(cloudsSR).updateMask(cirrusSR.not()).updateMask(shadowSR.not());

#GEE
Облака показаны фиолетовым, cirrus — красным, а тени облаков — желтым цветом.

Видно, что эта маска работает гораздо лучше прежней, хотя до совершенства ей далеко.

Например, порог вероятности облачности взят слишком агрессивным — удалено много лишних пикселей. Это — типичная проблема работы с масками облачности: нельзя указать глобальное значение порога. Порог подбирается локально, для конкретной сцены, так что бы разделить облака и бликующие объекты на земной поверхности.

Эту маску уже можно применять на практике. Есть более совершенные маски, и с одной из них мы позже познакомимся. Но они считаются гораздо дольше.

Код примера: https://code.earthengine.google.com/467bda21cbbfe7030597c8f242ef9cd8
Запуск новой японской ракеты-носителя H3 закончился аварией

Ракета стартовала 7 марта в 1:37:55 утра по всемирному времени (UTC). Отделение первой ступени произошло примерно через пять минут полета, однако двигатель второй ступени не запустился. После того как запуск двигателя не удалось подтвердить, а скорость ракеты продолжила падать, JAXA отдало команду на самоуничтожение ракеты. Вместе с ней была потеряна полезная нагрузка — спутник ALOS-3.

H3 — первая большая ракета, которую Япония разработала за последние 30 лет. Она должна заменить ракеты семейства H2, обеспечив более высокую грузоподъемность при одновременном снижении стоимости запуска (планируемая стоимость запуска для клиентов — около 37 миллионов долларов США).

H3 разрабатывалась совместно JAXA и Mitsubishi Heavy Industries, и обошлась примерно в 1.5 миллиарда долларов. Работы начались в 2014 году, и первый запуск ракеты был запланирован на март 2021 года, но был перенесен из-за проблем с новым двигателем первой ступени LE-9.

Жидкостный криогенный ракетный двигатель LE-9 называют одним из основных факторов, обеспечивающих снижение стоимости запуска. В ходе испытаний в мае 2020 года были обнаружены треснувшие лопатки турбины в турбонасосе LE-9 и отверстие в стенке камеры сгорания. Решение этих проблем затянулось, а планы запусков H3 сместились сначала на 2022, а затем и на 2023 год.

Потерянный в результате аварии трехтонный спутник ALOS-3 должен был вести съемку высокого разрешения в видимом и ближнем инфракрасном диапазонах.

А вот теперь — комментарии. Проблемная ракета (первая за 30 лет), новый двигатель (тоже проблемный долгострой), более высокий риск пусков у новых ракет: что заставило JAXA выводить такой рискованной конфигурацией дорогущий трехтонный спутник? Почему нельзя было заменить его чем-то более дешевым (макетом)?

Мы уж было подумали, что ALOS-3 — радар (на ALOS и ALOS-2 стояли радары L-диапазона, много сделавшие для наблюдения лесов). Оказалось, что нет. Радарным будет следующий спутник ALOS-4, который планируется запускать в этом году, снова на H3. Надеемся, специалисты JAXAпотомки самураев будут в этот раз более осмотрительны.
epic.gif
12.9 MB
Снимки Земли с расстояния 1.5 миллиона километров, cделанные космическим аппаратом DSCOVR 6 марта 2023 года.
DSCOVR (Deep Space Climate Observatory) — американский космический аппарат для наблюдения за Солнцем и Землей, совместный проект NASA и NOAA. Находится в точке Лагранжа L1 системы Солнце-Земля, на расстоянии около 1.5 миллиона километров от Земли.

Со своей точки обзора DSCOVR непрерывно видит Солнце и освещенную Солнцем сторону Земли. Он отслеживает солнечный ветер, обеспечивает раннее предупреждение о приближающихся выбросах корональной массы и наблюдает за явлениями на Земле, включая изменения концентрации озона, аэрозолей, пыли и вулканического пепла, высоты облаков, растительного покрове и климата.

Основными научными приборами DSCOVR являются плазменный магнитометр (PlasMag), наблюдающий Солнце, и наблюдающие Землю радиометр NIST Advanced Radiometer (NISTAR) и Earth Polychromatic Imaging Camera (EPIC).

EPIC делает снимки освещенной солнцем стороны Земли в десяти различных каналах — от ультрафиолетового до ближнего инфракрасного (317, 325, 340, 388, 443, 552, 680, 688, 764 и 779 нм). Пространственное разрешение снимков оставляет 25 км/пиксель.

EPIC делает снимки всей Земли примерно каждые два часа. NASA публикует их в режиме, близком к реальному времени, через веб-сайт прибора: https://epic.gsfc.nasa.gov

#nrt #данные #снимки
Космический аппарат DSCOVR (слева). Схема расположения точек Лагранжа системы Солнце-Земля (справа).
lunar_transit.gif
14.9 MB
Вот еще чудная съемка DSCOVR EPIC: транзит Луны по диску Земли 11 февраля 2021 года.
GEE-19. Маскирование облаков и теней: s2cloudless

Речь пойдет об алгоритме маскирования облаков s2cloudless. Он разработан специалистами Sentinel Hub, и уже несколько лет применяется GEE. На сегодняшний день это, на наш взгляд, лучший алгоритм маскирования облаков по данным одного снимка*.

s2cloudless основан на алгоритмах машинного обучения (LightGBM). С его помощью на GEE создана коллекция данных Sentinel-2: Cloud Probability, в которой каждому реальному снимку Sentinel-2 (COPERNICUS_S2 или COPERNICUS_S2_SR) сопоставлен снимок с единственным слоем — вероятностью того, что пиксель является облаком (от 0 до 100).

Тестовый снимок будет тот же, что и в прошлый раз. План работы такой:

1. Объедим коллекции снимков Sentinel-2 surface reflectance и Sentinel-2 cloud probability в единую коллекцию.
2. Для новой коллекции создадим маски облаков и теней, в виде дополнительных слоев.
3. Объединим маски облаков и теней.
5. Применим полученную маску к снимкам коллекции.

Для создания коллекции “снимки + вероятность облачности” задаем параметры: AOI (Area of interest), начальную и конечную даты съемки (START_DATE, END_DATE), и максимальную долю облачного покрытия снимков CLOUD_MAX.

Ключевой операцией является объединение коллекций снимков s2_sr_col и вероятности облачности s2_cloudless_col по идентификаторам снимков — свойству 'system:index':

var s2_sr_cloudless_col = ee.Join.saveFirst('s2cloudless').apply({
primary: s2_sr_col,
secondary: s2_cloudless_col,
condition: ee.Filter.equals({leftField: 'system:index', rightField: 'system:index'})
});

Объединенная коллекция состоит из элементов (снимков) первой коллекции (s2_sr_col), к которым в виде нового свойства 's2cloudless' добавлены соответствующие элементы из второй коллекции (вероятности).

ee.Join объединяет коллекции, saveFirst() задает имя свойства, в котором сохраняются элементы второй коллекции, apply() указывает какие коллекции и по какому свойству объединять.

Код примера: https://code.earthengine.google.com/3034b502757037ac2ce7d7af313abb90


*Есть алгоритмы маскирования облачности, использующие временные ряды снимков, например, MAJA. Но они, естественно, требуют больших вычислительных затрат, чем алгоритмы, опирающиеся на данные одного снимка.

#GEE
Новый слой s2cloudless, появившийся в результате объединения коллекций снимков и вероятности облачности.
Для маскирования облаков зададим параметр CLD_PRB_THRESH — вероятность облачности (%). Значения выше CLD_PRB_THRESH считаются облаком.

Выберем из снимков слой с вероятностями облачности, выделим на нем значения выше CLD_PRB_THRESH, и сохраним в виде нового слоя — маски облаков clouds:

function add_cloud_bands(img){
// Get s2cloudless image, subset the probability band.
var cld_prb = ee.Image(img.get('s2cloudless')).select('probability');
// Condition s2cloudless by the probability threshold value.
var is_cloud = cld_prb.gt(CLD_PRB_THRESH).rename('clouds');
// Add the cloud probability layer and cloud mask as image bands.
return img.addBands(ee.Image([cld_prb, is_cloud]));
}


Маска теней shadows строится по пересечению темных объектов на снимке с рассчитанным положением теней облаков на земной поверхности (по известным углам освещенности Солнцем). Из маски удаляются пиксели водоемов, которые, как правило, являются темными объектами.

Для настройки маски задаются параметры:

* NIR_DRK_THRESH — отражение в NIR-канале B8. Значения ниже указанного порога считаются потенциальными тенями облаков;
* CLD_PRJ_DIST — максимальное расстояние в километрах от границ облаков, на котором ищут тени облаков;
* BUFFER — целое число (метры) для дилатации границ облаков (дилатация — это операция из математической морфологии).

Маска теней не относится напрямую к s2cloudless и может использоваться с другими масками облаков. Например, с этими. Она может применятся как к коллекции COPERNICUS_S2_SR (BOA), так и к COPERNICUS_S2 (TOA) — нужно только изменить способ определения водоемов. Вместо

// Определение пикселей воды по слою SCL (BOA).
var not_water = img.select('SCL').neq(6);


задать:

// Для определения пикселей воды на данных TOA.
var not_water = img.normalizedDifference(['B3', 'B8']).lt(0.2)


Значение переменной SR_BAND_SCALE (1e4) задано в предположении, что масштабирования значений пикселей основных каналов снимка не проводилось, и все они находятся в диапазоне от 0 до 10000. Обратите внимание на эту переменную, если вы уже применяли масштабирование.

#GEE
В функции add_cld_shdw_mask() маски облаков и теней объединяются в единую маску — слой cloudmask. Нюансы объединения объяснены в коде функции.

Наконец, полученные маски применяются ко всем снимкам коллекции.

На снимке облака выделены фиолетовым, а тени — желтым цветом. Видно, что горы (справа, вверху и внизу) остались неотмаскированы, в отличие от результатов применения прошлых масок.
Рассмотрим фрагмент снимка. Облака выделены довольно хорошо. С тенями ситуация похуже, есть над чем поработать. Но в целом, результат приемлемый.