Ham Sentinel 2 jp2 - RGB geotiff


11

Sentinel 2 jp2 bant dosyalarını ( B02, B03, B04 ) birleştirmenin ve RGB renklerini düzeltmenin bir yolunu arıyorum . Hepsi bash veya python betiği ile yapılmalıdır. Örneğim için bu görüntüler üzerinde çalışıyorum . İdeal olarak çözüm bu eğiticiye yakın olacaktır .

Grupları bu komutla birleştirebiliyorum

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

Ama nedense RGB renklerini imagemagic komutuyla düzeltemiyorum. Çıktı ~ 700MB siyah görüntüdür.

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

Sonunda harita kutusuna yüklemek için geotiff dosyasına sahip olmak istiyorum. convertParametrelerin nasıl seçilmesi gerektiğine ilişkin açıklama memnuniyetle karşılanmaktadır.

Uydu görüntüsünün hangi kısmının tarım arazisi olduğunu tahmin etmesi gereken bir uygulama geliştiriyorum. Bir sahne görüntüsü daha küçük yamalara (belki 64x64) kesilir ve CNN ( kırpma veya kırpma olmayan ) olarak sınıflandırılır . Bu veri kümesini Inception-v3 modelini eğitmek için kullanıyorum . Veri seti, 10m uzamsal çözünürlük ile 64x64 RGB görüntüler içerir.


Merged.tif hakkında daha fazla bilgi

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

Bu @ben çözeltisi uygulanmadan önce ve sonra birleştirilir. önce sonra


1
Birleştirmenin bit derinliği nedir. Histogramdaki t ve min, ortalama ve maks? gdalinfo -hist merged.tif
Şununla

@ user30184 Sorumun istenen bilgi eklendi
gkiko

Jp2'yi geotiff'e dönüştürüp sonra renk düzeltmesini uyguladım ama yine de siyah bir görüntü elde ettim
gkiko

neden sadece temelde aynı olan TCI.jp2 görüntüsünü kullanmıyorsunuz -scale 0 4096 0 255?
pLumo

1
kırpma / kırpma dışı için, belki sıfırdan kendi uygulamanızı oluşturmak yerine bu esa-sen2agri.org/resources/software kullanabilirsiniz
radouxju

Yanıtlar:


8

Sorunun 2 kısmı var. Birincisi, 16 bit'ten 8 bit'e dönüştürmek istediğinizdir ve önceki cevapta belirtildiği gibi gdal_translate'in -scale seçeneği bunu yapar.

 -scale minOriginal maxOriginal minOutput maxOutput  

İkinci sorun kontrast geliştirme sorunudur: yeniden ölçeklendirdiğinizde, ilgilendiğiniz pikseller için yüksek bir kontrast elde etmek istersiniz. UYARI: "Sihirli" kontrast yoktur, çünkü yeniden ölçeklendirdiğinizde genellikle bazı bilgileri kaybedersiniz : verilerin görselleştirilmesini geliştirmek için yapılır ve profesyonel yazılımlar bunu yeni bir dosya yazmadan anında yapar. Verilerinizi daha fazla işlemek istiyorsanız, "siyah" geotiffiniz jp2'nizle aynı bilgileri içerir ve işlenmeye hazırdır. Örneğin bitki örtüsü indeksini hesaplarsanız, bu yeniden ölçeklendirilmiş değerlerle değil, "orijinal" yansıtma değerleri ile yapılmalıdır. Bununla birlikte, görsel olarak geliştirilmiş 8 bitlik bir görüntü oluşturmak için bazı adımlar.

@ben, yansıtmayı 0-1'den (bu ürünle 10000 ile çarpılır) 0-255'e yeniden ölçeklendirmek için genel bir yöntem verdi. Bu güvenlidir (dışlama yoktur), ancak sadece bulutlar ve bazı çıplak toprakların gerçekten yüksek yansımaları vardır, bu nedenle karada (çıplak topraklar hariç) fazla bir şey görmezsiniz ve suda hiçbir şey görmezsiniz. Bu nedenle, görüntülere yaygın olarak uygulanan kontrast geliştirmeleri, tüm aralığın yalnızca bir alt kümesinin alınmasından oluşur. Güvenli tarafta, ortak Dünya yüzey malzemesinin maksimum yansımasının genellikle 0.5 / 0.6'nın altında olduğu bilgisini kullanabilirsiniz ( buraya bakınbazı örnekler için). Elbette bu, görüntünüzün atmosferik olarak düzeltildiğini varsayar (L2A görüntüleri). Bununla birlikte, yansıtma aralığı her spektral bantta farklılık gösterir ve ilgi alanınızda her zaman en parlak Dünya yüzeylerine sahip olmazsınız. "Güvenli" yöntem şöyle görünür (maksimum yansıtma değeri 0,4, @RoVo tarafından önerilen 4096 gibi)

resim açıklamasını buraya girin

Öte yandan, kontrast her bant için optimize edilebilir. Bu aralığı manuel olarak tanımlayabilirsiniz (örn. Su rengiyle ilgileniyorsunuz ve suyun beklenen maksimum yansıtma değerini biliyorsunuz) veya görüntü istatistiklerine dayanarak. Yaygın olarak kullanılan bir yöntem, değerlerin yaklaşık% 95'inin korunmasından ve geri kalanının "çok koyu -> 0 veya çok parlak -> 255), ortalama değerin +/- 1,96 * standart sapma. Tabii ki, bu sadece bir yaklaşımdır çünkü normal bir dağılım varsayar, ancak pratikte oldukça iyi çalışır (çok fazla bulutunuz olduğunda veya istatistiklerin bazı NoData değerlerini kullanması dışında).

İlk grubunuzu örnek olarak alalım:

ortalama = 320

std = 536

% 95 güven aralığı = [-731: 1372]

ancak elbette yansıma her zaman sıfırdan büyüktür, bu nedenle minimum değeri 0'a ayarlamanız gerekir.

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

Ve gdal'ın yeni bir sürümüne sahipseniz, -scale_ {band #} (0 255 varsayılan çıktıdır, bu yüzden tekrarlamıyorum) kullanabilirsiniz, böylece tek bantları bölmenize gerek kalmaz. Ayrıca ara dosya olarak tif yerine vrt kullandım (tam bir resim yazmaya gerek yok: sanal bir tane yeterlidir)

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

İstatistiklerinizin, bulutlar ve NoData gibi "yapay öğeler" den ciddi şekilde etkilendiğini unutmayın. Bir tarafta, aşırı değerleriniz olduğunda varyans fazla tahmin edilir. Öte yandan, büyük miktarda "sıfır" değer olduğunda (otomatik olarak kontrastlı görüntüyü örnekte olduğu gibi çok parlak hale getirir) olduğunda ortalamanız hafife alınır ve bulutların çoğunluğu varsa ( görüntü çok karanlık). Bu aşamada, sonuçlar elde edebileceğiniz en iyi sonuç olmayacaktır.

resim açıklamasını buraya girin

Otomatik bir çözüm "NODATA" olarak ayarlayın arka plan ve bulut değerlerine olmak ve (nodata olmadan istatistikleri hesaplamak görecekti Bu yayını nodata olmadan istatistikleri hesaplama ile ilgili ayrıntılar için, ve bu bir nodata için 4000 daha büyük set değerlere bir örnek için de ). Tek bir görüntü için, genellikle mümkün olan en büyük bulutsuz alt kümedeki istatistikleri hesaplarım. "NoData" (görüntünüzün sol üstünde) bulunmayan bir alt kümedeki istatistiklerle, sonuçta sonuç elde edilir. Aralığın "güvenli" aralığın yaklaşık yarısı olduğunu görebilirsiniz, bu da iki kat daha fazla kontrastınız olduğu anlamına gelir:

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

resim açıklamasını buraya girin

Son bir açıklama olarak, gdal_constrast_stretch iyi görünüyor ama test etmedim


buradaki sorun, her granülün farklı parlaklığa sahip olmasıdır. Neyi başarmak istediğine bağlı olarak sabit bir ölçek kullanmak daha iyidir. -scale 0 4096 0 255bulut dokularına ihtiyacımız yoksa oldukça iyi bir çıktı üretir ...
pLumo

@RoVo Bunun bight değerleri vereceğini ve kum gibi parlak yüzeylerde kontrastı kaybedebileceğinizi kabul ediyorum, ancak bu OP tarafından birleştirilmiş görüntüdeki istatistiklere dayanıyor . Granüllerde farklı bir kontrast olmayacak. Genellikle, kırmızı, yeşil ve mavi aralık NIR'deki aralıktan çok daha küçüktür, bu yüzden her bant için farklı bir kontrast kullanmak mantıklıdır.
radouxju

7

Dosyalarda bulunan TCI.jp2dosyayı kullanabilirsiniz SAFE.zip. Bu dosyaların Ekim 2016'dan önce S2 dosyalarında mevcut olmadığını unutmayın

Alternatif olarak bantları GDAL kullanarak dönüştürebilirsiniz:

# 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 4096Sentinel-2 sahneleri için makul bir değerdir ve afaik TCI.jp2 görüntüleri için de kullanılır. Daha açık bir sonuç almak istiyorsanız 4096'yı indirin.


5

Soruda bağladığınız çözüm olarak bir çözüm arıyorsanız , öğreticide indirmek için sağlanan Landsat 8 işleme kabuğu skriptini izlemeli ve ayarlamalısınız .

Özellikle, orada yapıldığı gibi, önce tek bantları yeniden ölçeklendirmek isteyebilirsiniz, örneğin:

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

Resimlerinizin histogramının, görüntünüzde yalnızca çok koyu yüzeylere sahip olduğunuzu gösterdiğini (bu durumda mı?), Ancak genellikle sentinel-2 görüntünüzün, atmosfer değerleri veya yüzeyde yansıma olacağını ve değerlerin genellikle 0 arasında değiştiğini unutmayın. ve 10000 - daha yüksek değerler de mümkün olmadıkça, örneğin görüntüde bulutlarınız varsa.

Ardından bantları birleştirebilir ve görüntü görünümüne ince ayar yapabilirsiniz:

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

Bunu yaparken imajıma ne olur:

resim açıklamasını buraya girin


1
Sorumu güncelledim. GeoTIFF renk düzeltme yaparken hangi parametrelerin kullanılacağına nasıl karar vermeliyim?
gkiko

Girişten çıkış görüntüsüne değerleri ölçeklerken her zaman giriş görüntüsünde maksimum ve min değerine bakın. Örneğin, ilk bant için ölçek parametresi şu şekilde olmalıdır: ölçek 0 4818 0 255.
Milos Miletic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.