Сирий Sentinel 2 jp2 для геотифів RGB


11

Я шукаю спосіб об'єднати смугові файли Sentinel 2 jp2 ( B02, B03, B04 ) та виправити кольори RGB. Все слід робити з скриптом bash або python. Для мого прикладу я працюю над цими образами . В ідеалі рішення буде близьким до цього підручника.

Я в змозі об'єднати смуги з цією командою

gdal_merge.py -separate -co PHOTOMETRIC=RGB -o merged.tif B04.jp2 B03.jp2 B02.jp2

Але я чомусь не можу виправити кольори RGB за допомогою imagemagic команди. Вихід - чорне зображення ~ 700 Мб.

convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,20% -modulate 100,150 merged.tif merged-cc.tif

Врешті-решт, я хотів би мати файл geotiff, щоб завантажити його в mapbox. Пояснення того, як слід обирати convertпараметри, вітається.

Я розробляю додаток, який повинен здогадатися, яка частина супутникового зображення - це сільськогосподарська земля. Зображення сцени буде розрізано на менші патчі (можливо, 64х64) і буде класифіковане CNN ( обрізати чи не обрізати ). Я використовую цей набір даних для навчання моделі Inception-v3. Набір даних містить зображення 64х64 RGB з просторовим дозволом 10 м.


Більше інформації про merged.tif

Band 1 Block=10980x1 Type=UInt16, ColorInterp=Red
  Metadata:
    STATISTICS_MAXIMUM=4818
    STATISTICS_MEAN=320.61101402206
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=536.76609312554
Band 2 Block=10980x1 Type=UInt16, ColorInterp=Green
  Metadata:
    STATISTICS_MAXIMUM=4206
    STATISTICS_MEAN=350.98505344194
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=534.43264268631
Band 3 Block=10980x1 Type=UInt16, ColorInterp=Blue
  Metadata:
    STATISTICS_MAXIMUM=3801
    STATISTICS_MEAN=364.44611471973
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=544.55509661709

Це об'єднано.tif до та після застосування рішення @ ben раніше після


1
Яка це бітова глибина злитого.tif та min, середня та max у гістограмі? Перевіртеgdalinfo -hist merged.tif
user30184

@ user30184 Я додав запитувану інформацію до свого питання
gkiko

Я спробував перетворити jp2 в геотиф, а потім застосував корекцію кольору, але все одно отримую чорне зображення
gkiko

чому ви просто не використовуєте образ TCI.jp2, який в основному такий же, як -scale 0 4096 0 255?
pLumo

1
для врожаю / не врожаю, можливо, ви можете використовувати цей esa-sen2agri.org/resources/software замість створення власного додатку з нуля
radouxju

Відповіді:


8

Є 2 частини проблеми. Перший полягає в тому, що ви хочете перетворити з 16 біт на 8 біт, і параметр -scale gdal_translate робить це, як зазначено в попередній відповіді.

 -scale minOriginal maxOriginal minOutput maxOutput  

Друга проблема - це проблема з покращенням контрасту. Коли ви повторно масштабуєте, ви хочете мати високий контраст для пікселів, які вас цікавлять. ПОПЕРЕДЖЕННЯ. Немає "магічного" контрасту, оскільки при повторному масштабі ви зазвичай втрачаєте деяку інформацію : це робиться для поліпшення візуалізації даних, а професійні програмні засоби роблять це на ходу, не записуючи новий файл. Якщо ви хочете додатково обробити ваші дані, ваш "чорний" геотиф містить ту саму інформацію, що й jp2, і він готовий до обробки. Якщо ви обчислюєте, наприклад, індекси рослинності, це слід робити з "вихідними" значеннями відбиття, а не з повторно оціненими. Однак, ось кілька кроків для створення візуально покращеного 8-бітового зображення.

@ben дав вам загальний метод змінити коефіцієнт відбиття від 0-1 (помножений на 10000 з цим продуктом) до 0-255. Це безпечно (без виключення), але тільки хмари та голі ґрунти мають дійсно високу світловідбиваючу здатність, тому на суші ви не бачите багато (крім голих ґрунтів) і нічого у воді. Тому покращення контрасту, що зазвичай застосовується до зображень, полягає у прийнятті лише підмножини повного діапазону. З безпечного боку ви можете використовувати знання про те, що максимальна відбивна здатність звичайного земного матеріалу зазвичай нижче 0,5 / 0,6 (див. Тутдля деяких прикладів). Звичайно, це передбачає, що ваше зображення було скоректовано атмосферно (зображення L2A). Однак діапазон відбиття відрізняється в кожному спектральному діапазоні, і ви не завжди маєте найяскравіші земні поверхні у вашій цікавій зоні. Ось як виглядає "безпечний" метод (з максимальним відбиттям 0,4, як 4096, запропонований @RoVo)

введіть тут опис зображення

З іншого боку, контраст можна оптимізувати для кожного діапазону. Ви можете визначити цей діапазон вручну (наприклад, вас цікавить колір води і ви знаєте максимальне очікуване значення відбиття води) або на основі статистичних даних зображення. Загальновживаний метод полягає у збереженні приблизно 95% значень та "відхиленні" (занадто темне -> 0 або занадто яскраве -> 255) решта, що аналогічно визначенню діапазону на основі середнього значення +/- 1,96 * стандартне відхилення. Звичайно, це лише наближення, оскільки воно передбачає нормальне розповсюдження, але воно працює досить добре на практиці (за винятком випадків, коли у вас занадто багато хмар або якщо статистика використовує деякі значення NoData).

Давайте візьмемо для прикладу свою першу групу:

середній = 320

std = 536

95% довірчий інтервал = [-731: 1372]

але, звичайно, коефіцієнт відбиття завжди більший за нуль, тому потрібно встановити мінімум у 0.

gdal_translate -scale 0 1372 0 255 -ot Byte  B01.jp2 B01-scaled.tif  

І якщо у вас є остання версія gdal, ви можете використовувати -scale_ {band #} (0 255 - вихід за замовчуванням, тому я не повторюю його), так що вам не потрібно розділяти окремі смуги. Також я використовував vrt замість tif як проміжний файл (не потрібно писати повне зображення: достатньо віртуального)

gdalbuildvrt -separate stack.vrt B04.jp2 B03.jp2 B02.jp2
gdal_translate -scale_1 0 1372 -scale_2 0 1397 -scale_3 0 1430 -ot Byte  stack.vrt im_rescaled.tif

Зауважте, що на вашу статистику сильно впливають такі "артефакти", як хмари та NoData. З одного боку, дисперсія завищена, коли у вас є екстремальні значення. З іншого боку, ваше середнє значення занижене, коли існує велика кількість "нульових" значень (що робить автоматично контрастне зображення занадто яскравим, як на прикладі), і було б завищено, якби було більшість хмар (що зробило б зображення занадто темне). На цьому етапі результати не були б найкращими, які ви могли отримати.

введіть тут опис зображення

Автоматизоване рішення буде набір фонових і хмарних значення «NoData» і обчислити статистику без NoData (див цього поста для отримання докладної інформації про обчисленні статистики без NoData, і це один для прикладу , щоб встановити значення більше , ніж 4000 до NoData , а також ). Для одного зображення я зазвичай обчислюю статистику щодо найбільшого можливого безхмарного підмножини. Статистичні дані з підмножини, де немає "NoData" (у верхньому лівому куті зображення), це дає кінцевий результат. Ви можете бачити, що діапазон становить приблизно половину "безпечного" діапазону, це означає, що у вас вдвічі більше контрасту:

gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte  stack.vrt im_rescaled.tif

введіть тут опис зображення

Як останнє зауваження, gdal_constrast_stretch виглядає добре, але я не пройшов тестування


Проблема в цьому полягає в тому, що кожна гранула матиме різну яскравість. Залежно від того, чого він хоче досягти, краще використовувати фіксовану шкалу. -scale 0 4096 0 255дає досить хороший вихід, якщо нам не потрібні хмарні текстури ...
pLumo

@RoVo Я погоджуюсь, що це дасть великі значення, і ви можете втратити контраст на яскравих поверхнях, таких як пісок, але це базується на статистиці злитого зображення в ОП. У вас не буде різного контрасту на гранулах. Зазвичай діапазон червоного, зеленого та синього кольорів набагато менший, ніж діапазон у NIR, тому використання різного контрасту для кожної смуги має сенс.
radouxju

7

Ви можете просто використовувати той TCI.jp2файл, який входить до SAFE.zipфайлів. Зауважте, що ці файли недоступні у файлах S2 до жовтня 2016 року

Можна також перетворити смуги за допомогою GDAL:

# Merge bands
gdalbuildvrt -separate TCI.vrt B04.jp2 B03.jp2 B02.jp2

# Convert to uncompressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -scale 0 4096 0 255 TCI.vrt TCI.tif

# _OR_ Convert to JPEG - compressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -scale 0 4096 0 255 TCI.vrt TCI.tif

-scale 0 4096є розумним значенням для сцен Sentinel-2, а afaik також використовується для зображень TCI.jp2. Опустіть 4096, якщо хочете отримати більш легкий результат.


5

Якщо ви шукаєте рішення як відповідне вам питання, слід дотримуватися та коригувати скрипт оболонки обробки Landsat 8, який надається для завантаження у підручнику.

Зокрема, як це робиться там, ви спершу можете спробувати змінити масштаб одиничних діапазонів, наприклад наступним чином:

gdal_translate -ot Byte -scale 0 10000 0 255 B04.jp2 B04-scaled.tif 
gdal_translate -ot Byte -scale 0 10000 0 255 B03.jp2 B03-scaled.tif
gdal_translate -ot Byte -scale 0 10000 0 255 B02.jp2 B02-scaled.tif

Зверніть увагу, що гістограма ваших зображень говорить про те, що у вас є лише дуже темні поверхні на вашому зображенні (це так?), Але зазвичай ваше зображення дозорного-2 буде відбитком атмосфери або на поверхні, де значення зазвичай варіюються між 0 та 10000 - якщо також можливі більш високі значення, наприклад, якщо на зображенні є хмари.

Тоді ви можете об'єднати смуги і тонко налаштувати зовнішній вигляд зображення:

gdal_merge.py -v -ot Byte -separate -of GTiff -co PHOTOMETRIC=RGB -o RGB-scaled.tif B04-scaled.tif B03-scaled.tif B02-scaled.tif
convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,40% -modulate 100,150 RGB-scaled.tif RGB-scaled-cc.tif

Ось що відбувається з моїм зображенням при цьому:

введіть тут опис зображення


1
Я оновив своє запитання. Як я повинен вирішити, які параметри використовувати при корекції кольорів geoTIFF?
gkiko

Під час масштабування значень від вхідного до вихідного зображення завжди дивіться на максимальне та мінімальне значення у вхідному зображенні. Наприклад, для першого діапазону параметр масштабу повинен бути таким - масштаб 0 4818 0 255.
Мілош Мілетіч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.