Commit f29fce10 authored by Gaetano Raffaele's avatar Gaetano Raffaele
Browse files

ENH: improve ROI based filtering

parent b920378a
No related merge requests found
Showing with 37 additions and 20 deletions
+37 -20
...@@ -161,7 +161,12 @@ class S2TheiaTilePipeline: ...@@ -161,7 +161,12 @@ class S2TheiaTilePipeline:
er.SetParameterString('in', bnd) er.SetParameterString('in', bnd)
er.SetParameterString('mode', 'fit') er.SetParameterString('mode', 'fit')
er.SetParameterString('mode.fit.vect', roi) er.SetParameterString('mode.fit.vect', roi)
er.Execute() try:
er.Execute()
except Exception as e:
if not 'Extraction Region not consistent with output image' in str(e):
print(e)
return False
arr = er.GetImageAsNumpyArray('out') arr = er.GetImageAsNumpyArray('out')
if (np.sum(arr != cls.NDT) / (arr.shape[0]*arr.shape[1])) <= min_surf: if (np.sum(arr != cls.NDT) / (arr.shape[0]*arr.shape[1])) <= min_surf:
return False return False
...@@ -219,25 +224,31 @@ class S2TheiaTilePipeline: ...@@ -219,25 +224,31 @@ class S2TheiaTilePipeline:
self.input_dates = [self.input_dates[i] for i in idx] self.input_dates = [self.input_dates[i] for i in idx]
self.tile_cloud_percentage = [self.tile_cloud_percentage[i] for i in idx] self.tile_cloud_percentage = [self.tile_cloud_percentage[i] for i in idx]
self.set_input_epsg() if len(self.image_list) > 0:
self.output_epsg = self.input_epsg self.set_input_epsg()
self.output_dates = self.input_dates self.output_epsg = self.input_epsg
self.output_dates = self.input_dates
for img in self.image_list:
for p in self.PTRN_ful: for img in self.image_list:
ifn, ofn = self.get_file(img, p) for p in self.PTRN_ful:
self.append(to_otb_pipeline(ifn), ofn, self.REF_TYPE, 'out', is_output=True) ifn, ofn = self.get_file(img, p)
for p in self.PTRN_msk: self.append(to_otb_pipeline(ifn), ofn, self.REF_TYPE, 'out', is_output=True)
ifn, ofn = self.get_file(img, p) for p in self.PTRN_msk:
self.append(to_otb_pipeline(ifn), ofn, self.MSK_TYPE, 'out', is_output=True) ifn, ofn = self.get_file(img, p)
self.append(to_otb_pipeline(ifn), ofn, self.MSK_TYPE, 'out', is_output=True)
else:
warnings.warn('Empty pipeline after filtering for tile {}.'.format(self.tile_id))
else: else:
warnings.warn('Empty pipeline. Need to set preprocessed inputs?') warnings.warn('Empty pipeline at init. Need to set preprocessed inputs?')
def __del__(self): def __del__(self):
if os.path.exists(self.temp_fld): if os.path.exists(self.temp_fld):
shutil.rmtree(self.temp_fld) shutil.rmtree(self.temp_fld)
def is_empty(self):
return len(self.image_list) == 0
def reset(self): def reset(self):
self.pipe = [] self.pipe = []
self.files = [] self.files = []
...@@ -775,20 +786,25 @@ class S2TheiaPipeline: ...@@ -775,20 +786,25 @@ class S2TheiaPipeline:
_tile_id = S2TilePipeline._tile_id _tile_id = S2TilePipeline._tile_id
tiles = [] tiles = []
def __init__(self, fld, temp_fld='/tmp', input_date_interval=None, max_clouds_percentage=None): def __init__(self, fld, temp_fld='/tmp', input_date_interval=None, max_clouds_percentage=None, roi=None):
self.folder = fld self.folder = fld
self.temp_fld = temp_fld self.temp_fld = temp_fld
self.input_date_interval = input_date_interval self.input_date_interval = input_date_interval
self.max_clouds_percentage = max_clouds_percentage self.max_clouds_percentage = max_clouds_percentage
self.roi = roi
self.tile_list = set() self.tile_list = set()
img_list = [os.path.abspath(x) for x in glob.glob(os.path.join(self.folder, self.S2TilePipeline.PTRN_dir)) img_list = [os.path.abspath(x) for x in glob.glob(os.path.join(self.folder, self.S2TilePipeline.PTRN_dir))
if os.path.isdir(x) or os.path.splitext(x)[-1] == '.zip'] if os.path.isdir(x) or os.path.splitext(x)[-1] == '.zip']
[self.tile_list.add(self._tile_id(x)) for x in img_list if self._check(x)] [self.tile_list.add(self._tile_id(x)) for x in img_list if self._check(x)]
assert all([self.S2TilePipeline(fld, t, dummy_read=True) for t in self.tile_list]) assert all([self.S2TilePipeline(fld, t, dummy_read=True) for t in self.tile_list])
self.tiles = [self.S2TilePipeline(fld, t, self.temp_fld, self.input_date_interval, self.max_clouds_percentage) for t in self.tile_list] self.tiles = [self.S2TilePipeline(fld, t, self.temp_fld, self.input_date_interval, self.max_clouds_percentage, filter_by_roi=self.roi) for t in self.tile_list]
self.tiles = [x for x in self.tiles if not x.is_empty()]
self.output_dates = None self.output_dates = None
self.roi = None
self.output_epsg = self.tiles[0].input_epsg if len(self.tiles) > 0:
self.output_epsg = self.tiles[0].input_epsg
else:
warnings.warn('Empty pipeline for the given image path.')
def __del__(self): def __del__(self):
for x in self.tiles: for x in self.tiles:
...@@ -824,6 +840,7 @@ class S2TheiaPipeline: ...@@ -824,6 +840,7 @@ class S2TheiaPipeline:
for t in self.tiles: for t in self.tiles:
t.preprocess() t.preprocess()
if self.roi is not None: if self.roi is not None:
print('Clipping')
t.clip(self.roi) t.clip(self.roi)
if align: if align:
if type(align_to) == str and os.path.exists(align_to): if type(align_to) == str and os.path.exists(align_to):
......
...@@ -40,9 +40,9 @@ def preprocess_s2(in_fld, out_fld, output_dates_file=None, roi=None, ...@@ -40,9 +40,9 @@ def preprocess_s2(in_fld, out_fld, output_dates_file=None, roi=None,
else: else:
raise ValueError("Unsupported/non-valid provider") raise ValueError("Unsupported/non-valid provider")
s2 = S2Processor(in_fld, temp_fld=out_fld) s2 = S2Processor(in_fld, temp_fld=out_fld, roi=roi)
if roi is not None: #if roi is not None:
s2.set_roi(roi) # s2.set_roi(roi)
if output_dates_file is not None: if output_dates_file is not None:
s2.set_output_dates_by_file(output_dates_file) s2.set_output_dates_by_file(output_dates_file)
else: else:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment