Birleştirme, maskeleme ve mozaikleme

l8 adlı bir değişkene Landsat 8 TOA yansıtma koleksiyonu yüklendiğinde aşağıdaki kodun son değer kompozitiyle sonuçlandığını görmüştünüz:

Kod Düzenleyici (JavaScript)

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

Bu kompozit görüntüyle ilgili sorunlardan biri, bulutlarla dolu olmasıdır. Koleksiyondaki son pikseli almak yerine (bir koleksiyonu haritaya eklediğinizde Earth Engine, koleksiyonda mosaic() işlevini örtülü olarak çağırır) ImageCollection işlevini azaltabilirsiniz (Görüntü koleksiyonlarını azaltma hakkında daha fazla bilgi edinin).

Reducers ile Birleştirme

Bir görüntü bölgesindeki istatistikleri alma için ilk olarak küçültücülerle tanıştınız. Bu, uzamsal bir azaltma işlemidir. Bir resim koleksiyonunu tek bir resme indirgemek, koleksiyon zaman içindeki resimleri temsil ettiğinde zamansal bir indirgemedir. Kullandığınız Reducer türü, Earth Engine'in çakışan pikselleri nasıl işleyeceğini tanımlar. Landsat 8, her 16 günde bir Dünya'nın aynı noktasını ziyaret eder. Bu, 6 aylık bir dönemde yaklaşık 12 resim olacağı (ve sahnelerin çakıştığı yerlerde daha fazla resim olacağı) anlamına gelir. Haritadaki her piksel, bir piksel yığınından elde edilir. Bu yığın, görüntülenen koleksiyondaki her bir resimden bir piksel içerir.

Koleksiyonu haritaya eklemek, yalnızca en son pikselin (gruptaki en son görüntüden alınan piksel) seçilmesine neden olur. Bu davranış, Earth Engine azaltıcıları kullanılarak değiştirilebilir. Örneğin, Earth Engine'e yığındaki en son pikseli almak yerine yığındaki ortanca değeri seçmesi talimatı verilebilir. Bu işlem, yüksek değere sahip bulutları ve düşük değere sahip gölgeleri kaldırma avantajı sunar. Bir resim koleksiyonu, ortanca azaltıcı kullanılarak azaltıldığında, birleşik değer zaman içinde her banttaki ortancadır. Örneğin, 2016'da Landsat sahnelerini kullanma:

Kod Düzenleyici (JavaScript)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

Bu koddaki yenilik, bir resim koleksiyonuna uygulanan median() yöntemidir. Filtreleme yöntemlerinde olduğu gibi bu da, görüntü koleksiyonlarında kullanılan ve ee.Reducer() değerini bağımsız değişken olarak alan daha genel reduce() yönteminin kısayoludur. Tüm Earth Engine azaltıcılarının listesini görmek için Kod Düzenleyici'nin Docs (Dokümanlar) sekmesindeki ee.Reducer paketine bakın. Bir resim koleksiyonu için küçültücü seçerken çıkışın bir resim olduğunu unutmayın. Bu nedenle, sayısal olmayan çıkışlara sahip küçültücüler (ör. histogram veya toList küçültücüler) resim koleksiyonuyla çalışmaz.

Tutorial_api_06_median_composite
Şekil 6. Landsat 8 medyan bileşeni.

Ortalama bileşeni uzaklaştırdığınızda Şekil 6'dakine benzer bir görüntü görmeniz gerekir. Bu, daha önce oluşturduğunuz son değer bileşiğinden çok daha iyi görünmelidir. Bu noktada, ortanca bileşik oluşturmak için neler yapıldığını düşünmek önemlidir. Earth Engine, ABD kıtası üzerindeki tüm Landsat 8 koleksiyonunu yükledi ve her piksel için medyanı hesapladı. Bu çok fazla veri demektir. Elbette, daha önce yaptığınız gibi önce koleksiyonu filtreleyerek yıllık ortancaları hesaplayabilirsiniz. Buradaki nokta, tüm bu görüntüleri indirip bu kompoziti oluşturmanız gerekseydi bunun büyük bir proje olacağıdır. Earth Engine ile saniyeler içinde sonuç alırsınız.

Birleştirme ve mozaik oluşturma hakkında daha fazla bilgiyi burada bulabilirsiniz.

Maskeleme

Medyan bileşik, son değer bileşiğine göre daha iyi olsa da görüntünün bazı kısımlarını maskelemek isteyebilirsiniz. Bir görüntüdeki pikselleri maskelemek, bu pikselleri şeffaf hale getirir ve analizden hariç tutar. Bir görüntünün her bandındaki her pikselin maskesi vardır. Maske değeri 0 veya daha düşük olanlar şeffaf olur. Maskesi 0'dan büyük olan tüm değerler oluşturulur. Bir resmin maskesi, image1.mask(image2) gibi bir çağrı kullanılarak ayarlanır. Bu çağrı, image2 değerlerini alır ve bunları image1 maskesi yapar. image2 içindeki değeri 0 olan tüm pikseller image1 içinde şeffaf hale getirilir.

Örneğin, ortalama bileşikteki tüm su piksellerini maskelemek istediğinizi varsayalım. Earth Engine veri kataloğunda bulunan Hansen ve diğerleri (2013) tarafından açıklanan veri kümesi kullanılarak su maskesi oluşturulabilir. (Hansen ve diğerlerinin veri kümesi hakkında daha fazla bilgiyi bu eğitimde bulabilirsiniz.) Bu veri kümesinde suyun değeri 2, karanın değeri 1 ve "veri yok"un değeri 0'dır. Toprak olmayan yerlerde sıfırların bulunduğu bir maske görüntüsü oluşturmak için biraz mantık kullanın:

Kod Düzenleyici (JavaScript)

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

Bu kodda ayrıntılı olarak bahsetmeye değer birkaç yeni nokta var. İlk olarak, select() işlevi, bir görüntüden ilgilenilen bantları çıkarmak için kullanışlıdır. Burada yalnızca ilgilendiğimiz bantı seçiyoruz: datamask. Bir sonraki yenilik, "eşittir" anlamına gelen eq() mantıksal operatörüdür. eq(1) bandında 1 değerine sahip olmayan tüm piksellerin (su veya veri içermeyenler) sonuçta elde edilen görüntüde 0 değerini aldığı ikili bir görüntü oluşturmak için datamask kullanırız.

Bu maskeleme sonucunda, karada bulunan (Hansen ve diğerleri veri kümesine göre) medyan kompozitindeki tüm pikseller görünür ancak suda bulunan (veya veri yok) pikseller şeffaftır ve maskedComposite görüntüsü üzerinde yaptığınız tüm analizlere dahil edilmez.

Mozaikleme

Resim koleksiyonları, mantıksal operatörler, maskeleme ve kompozisyon kavramlarını birleştirerek ilginç kartografik sonuçlar elde edebilirsiniz. Örneğin, kara piksellerinin gerçek renklerde, diğer tüm piksellerin ise mavi renkte gösterildiği bir resim istediğinizi varsayalım. Bu durumda aşağıdaki gibi bir işlem yapabilirsiniz:

Kod Düzenleyici (JavaScript)

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

Bu kodda çok şey oluyor, bu yüzden kodu inceleyelim. İlk olarak, daha önce oluşturduğumuz maskeyi ters çevirmek için not() mantıksal operatörünü kullanırız. Özellikle not() tüm sıfırları bire, sıfır olmayan tüm sayıları ise sıfıra dönüştürür. Bu değişkeni water olarak adlandırmak tamamen doğru olmasa da mevcut kartografik bağlamda sorun yoktur. Bunun nedeni, değişkenin bazı no-data piksellerini de içermesidir. Bir sonraki adım, "su"yu kendisiyle maskelemektir. Bu işlem sonucunda, tüm su piksellerinin 1 olduğu ve diğer her şeyin maskelendiği bir görüntü elde edilir. Son adım, görüntüleri mosaic() ile birleştirmektir. mosaic() bir resim koleksiyonu üzerinde çalıştığından, birleştirmek istediğimiz resimlerin listesini resim koleksiyonu oluşturucusuna iletiriz ve son adım olarak mosaic()'ı çağırırız. Bu listedeki resimlerin sırası önemlidir. Daha net bir ifadeyle, çıkış resminde giriş koleksiyonundaki resim yığınından alınan son maskelenmemiş piksel yer alır. Bu durumda, su katmanı koleksiyondaki son (en üstteki) resim olduğu ve yalnızca suyun bulunduğu yerlerde maskelenmemiş pikseller içerdiği için bu yöntem işe yarar.

Koleksiyondaki resimlerin görselleştirme resimleri olduğunu unutmayın. Bir resimde visualize() işlemini yaptığınızda, ilettiğiniz görselleştirme parametrelerine göre 3 bantlı, 8 bitlik bir resme dönüştürülür. Varsayılan görselleştirme parametreleri 3 bantlı, 8 bitlik görüntüler için uygundur. Bu nedenle, görüntüyü haritaya eklerken görselleştirme parametrelerine ihtiyacınız yoktur. Sonuç, Şekil 7'deki gibi görünmelidir.

Tutorial_api_07_mosaic.png
Şekil 7. Su alanlarını tek renk yapan özel mozaik

Bu noktada, resim koleksiyonlarını son değer kompozitleri olarak görselleştirme yöntemlerini, indirgeyicileri kullanarak resim koleksiyonlarını birleştirme yöntemlerini ve bir resim koleksiyonunu maskeleyip mozaikleyerek özel kompozitler oluşturma yöntemlerini gördünüz. Sonraki sayfada, bir koleksiyondaki her görüntüye bitki örtüsü dizini ekleme ve bu dizini kullanarak "en yeşil piksel" kompozit oluşturma hakkında bilgi edinin.