Пример #1
0
    def test_generate_mask(self):
        band = 'B1'
        mask = cloud_mask.sentinel2(cloud_S2)
        cld_score = self.score.generate_score(mask, band)
        vis = cld_score.visualize(
            min=0, max=1, palette=['b9936c', 'dac292', 'e6e2d3', 'c4b7a6'])

        region = cloud_S2.geometry().centroid().buffer(5000)
        url = vis.getThumbUrl({'region': tools.getRegion(region)})

        print('\nCloud Distance Score: {}\n'.format(url))
        self.assertEqual(cld_score.getInfo()['type'], 'Image')
def apply_mask_cloud(image_coll, collection_name, cloudy_pix_flag):
    """
    Different input_collections need different steps to be taken to handle
    cloudy image. The first step is to reject images that more than X%
    cloudy pixels (here X=5). The next step is to mask cloudy pixels. This
    will hopefully mean that when we take the median of the ImageCollection,
    we ignore cloudy pixels.

    Parameters
    ----------
    image_coll : ee.ImageCollection
        The ImageCollection of images from which we want to remove cloud.
    collection_name : str
        Name of the collection so that we can apply collection specific
        masking.
    cloud_pix_flag : str
        Name of the flag which details the fraction of cloudy pixels in each
        image.

    Returns
    ----------
    image_coll
        Image collection with very cloudy images removed, and masked images
        containing a tolerable amount of cloud.
    """

    # construct cloud mask if availible
    if collection_name == 'COPERNICUS/S2':
        mask_func = cloud_mask.sentinel2()
    elif collection_name == 'LANDSAT/LC08/C01/T1_SR':
        mask_func = cloud_mask.landsat8SRPixelQA()
    elif (collection_name == 'LANDSAT/LE07/C01/T1_SR'
          or collection_name == 'LANDSAT/LT05/C01/T1_SR'
          or collection_name == 'LANDSAT/LT04/C01/T1_SR'):
        mask_func = cloud_mask.landsat457SRPixelQA()
    else:
        print("No cloud mask logic defined for input collection {}"\
              .format(collection_name))
        return image_coll

    # images with more than this percent of cloud pixels are removed
    cloud_pix_frac = 50

    # remove images that have more than `cloud_pix_frac`% cloudy pixels
    if cloudy_pix_flag != 'None':
        image_coll = image_coll.filter(
            ee.Filter.lt(cloudy_pix_flag, cloud_pix_frac))

    # apply per pixel cloud mask
    image_coll = image_coll.map(mask_func)

    return image_coll
Пример #3
0
    def test_with_zeros(self):

        col = Collection.Sentinel2()
        score = MaskPercent()
        image = cloud_mask.sentinel2()(cloud_S2)
        bounds = image.geometry().buffer(-50000)
        computed = score.map(col, bounds)(image)

        maskprop = computed.get(score.name).getInfo()
        maskband = tools.get_value(computed,
                                   image.geometry().centroid(), 10,
                                   'client')[score.name]
        print(maskband, maskprop)

        self.assertEqual(maskband, maskprop)
Пример #4
0
    def test(self):
        iid = 'COPERNICUS/S2'
        collection = ee.ImageCollection(iid)
        date = '2017-03-07'
        p_cloud = ee.Geometry.Point([-65.84304, -24.82382])
        p_clear = ee.Geometry.Point([-65.88415, -24.82608])

        image = getimage(collection, date, area)

        masked = cloud_mask.sentinel2()(image)
        vals = get_value(masked, p_cloud, 30, 'client')

        show(iid, image, masked, bandsS2, 0, 5000)

        self.assertEqual(vals["B1"], None)
Пример #5
0
def mask_clouds(ee_img):
    mask_all = cloud_mask.sentinel2()
    masked_ee_img = mask_all(ee_img)
    return masked_ee_img
Пример #6
0
def test_cirrus():
    masked = cloud_mask.sentinel2(['cirrus'])(image)
    vals = getValue(masked, p_cirrus, 30)

    assert vals.get("B1").getInfo() == None
Пример #7
0
    def test_cloud_mask(self):
        from geetools import cloud_mask
        # LANDSAT 4 TOA
        masked_l4toa = cloud_mask.fmask("fmask")(self.l4toa)
        p_l4toa = ee.Geometry.Point([-72.2736, -44.6062])
        vals_l4toa = tools.get_value(masked_l4toa, p_l4toa, 30)
        self.assertEqual(vals_l4toa["B1"], None)

        # LANDSAT 5 USGS
        p_l5usgs = ee.Geometry.Point([-65.4991, -24.534])
        masked_l5usgs = cloud_mask.fmask("cfmask")(self.l5SR)
        vals_l5usgs = tools.get_value(masked_l5usgs, p_l5usgs, 30)
        self.assertEqual(vals_l5usgs["B1"], None)

        # LANDSAT 5 LEDAPS
        p_l5led = ee.Geometry.Point([-70.3455, -43.8306])
        masked_l5led = cloud_mask.ledaps(self.l5led)
        vals_l5led = tools.get_value(masked_l5led, p_l5led, 30)
        self.assertEqual(vals_l5led["B1"], None)

        # LANDSAT 5 TOA
        masked_l5toa = cloud_mask.fmask("fmask")(self.l5toa)
        p_l5toa = ee.Geometry.Point([-70.9003, -39.7421])
        vals_l5toa = tools.get_value(masked_l5toa, p_l5toa, 30)
        self.assertEqual(vals_l5toa["B1"], None)

        # LANDSAT 7 USGS
        p_l7usgs = ee.Geometry.Point([-64.8533, -26.1052])
        masked_l7usgs = cloud_mask.fmask("cfmask")(self.l7SR)
        vals_l7usgs = tools.get_value(masked_l7usgs, p_l7usgs, 30)
        self.assertEqual(vals_l7usgs["B1"], None)

        # LANDSAT 7 LEDAPS
        p_l7led = ee.Geometry.Point([-64.9141, -25.2264])
        masked_l7led = cloud_mask.ledaps(self.l7led)
        vals_l7led = tools.get_value(masked_l7led, p_l7led, 30)
        self.assertEqual(vals_l7led["B1"], None)

        # LANDSAT 7 TOA
        masked_l7toa = cloud_mask.fmask("fmask")(self.l7toa)
        p_l7toa = ee.Geometry.Point([-64.8495, -25.2354])
        vals_l7toa = tools.get_value(masked_l7toa, p_l7toa, 30)
        self.assertEqual(vals_l7toa["B1"], None)

        # LANDSAT 8 USGS
        p_l8usgs = ee.Geometry.Point([-65.5568, -24.3327])
        masked_l8usgs = cloud_mask.fmask("cfmask")(self.l8SR)
        vals_l8usgs = tools.get_value(masked_l8usgs, p_l8usgs, 30)
        self.assertEqual(vals_l8usgs["B1"], None)

        # LANDSAT 8 TOA
        masked_l8toa = cloud_mask.fmask("fmask")(self.l8toa)
        p_l8toa = ee.Geometry.Point([-71.7833, -43.6634])
        vals_l8toa = tools.get_value(masked_l8toa, p_l8toa, 30)
        self.assertEqual(vals_l8toa["B1"], None)

        # LANDSAT SENTINEL 2
        masked_s2 = cloud_mask.sentinel2(self.sentinel2)
        p_s2 = ee.Geometry.Point([-72.2104, -42.7592])
        vals_s2 = tools.get_value(masked_s2, p_s2, 10)
        self.assertEqual(vals_s2["B1"], None)

        # LANDSAT MODIS AQ
        masked_ma = cloud_mask.modis(self.modis_aqua)
        p_ma = ee.Geometry.Point([-69.071, -43.755])
        vals_ma = tools.get_value(masked_ma, p_ma, 500)
        self.assertEqual(vals_ma["sur_refl_b01"], None)

        # LANDSAT MODIS TE
        masked_te = cloud_mask.modis(self.modis_terra)
        p_te = ee.Geometry.Point([-71.993, -43.692])
        vals_te = tools.get_value(masked_te, p_te, 500)
        self.assertEqual(vals_te["sur_refl_b01"], None)
import ee
import numpy as np
import geetools
from geetools import ui, cloud_mask
import os, datetime
import pandas as pd
import itertools
import tensorflow as tf

cloud_mask_landsatSR = cloud_mask.landsatSR()
cloud_mask_sentinel2 = cloud_mask.sentinel2()

# tfrecord helper functions ----------------------------------------------------
# https://stackoverflow.com/questions/52324515/passing-multiple-inputs-to-keras-model-from-tf-dataset-api
# https://www.tensorflow.org/tutorials/load_data/tfrecord


def _bytes_feature(value):
    """Returns a bytes_list from a string / byte."""
    # If the value is an eager tensor BytesList won't unpack a string from an EagerTensor.
    if isinstance(value, type(tf.constant(0))):
        value = value.numpy()
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


def _float_feature(value):
    """Returns a float_list from a float / double."""
    return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))


def _int64_feature(value):
Пример #9
0
    def Sentinel2(cls):
        escalables = ["B2", "B3", "B4", "B8", "B11", "B12"]

        bandscale = dict(B1=60,
                         B2=10,
                         B3=10,
                         B4=10,
                         B5=20,
                         B6=20,
                         B7=20,
                         B8=10,
                         B8a=20,
                         B9=60,
                         B10=60,
                         B11=20,
                         B12=20)

        obj = cls(
            BLUE="B2",
            GREEN="B3",
            RED="B4",
            NIR="B8",
            SWIR="B11",
            SWIR2="B12",
            to_scale=escalables,
            process="TOA",
            clouds_fld="CLOUD_COVERAGE_ASSESSMENT",
            max=10000,
            fclouds=cld.sentinel2(),
            scale=10,
            bandscale=bandscale,
            bandmask="B2",
            family="Sentinel",
            ini=2015,
            short="S2",
            #col_id=13
        )
        obj.threshold = {
            'NIR': {
                'min': 700,
                'max': 4500
            },
            'RED': {
                'min': 50,
                'max': 2000
            },
            'SWIR': {
                'min': 400,
                'max': 3500
            },
            'SWIR2': {
                'min': 150,
                'max': 2800
            },
            'BLUE': {
                'min': 0,
                'max': 1000
            },
            'GREEN': {
                'min': 100,
                'max': 1500
            }
        }

        # obj.ID = "COPERNICUS/S2"
        obj.ID = IDS[obj.short]

        return obj