From 7b7c0a3dbfc5dd2743f030d1374d3e82521a2771 Mon Sep 17 00:00:00 2001 From: "raffaele.gaetano" <raffaele.gaetano@cirad.fr> Date: Fri, 17 Nov 2023 16:54:50 +0100 Subject: [PATCH] WIP: solving holes problem with light lsgrm --- OBIA/segmentation.py | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/OBIA/segmentation.py b/OBIA/segmentation.py index cb68a62..690f874 100644 --- a/OBIA/segmentation.py +++ b/OBIA/segmentation.py @@ -182,7 +182,9 @@ def lsgrm_light(input_image, params : LSGRMParams, out_seg, n_proc=None, memory= print('[INFO] Using a layout of {} x {} tiles.'.format(n_tiles_x,n_tiles_y)) print('[INFO] Nominal tile size w/margin: {} x {} pixels'.format(nominal_tw+2*params.margin, - nominal_th+2*params.margin)) + nominal_th+2*params.margin)) + + cumul_label, nholes = None, None if (n_tiles_x == 1 and n_tiles_y == 1): # Fallback to classical GRM @@ -212,29 +214,50 @@ def lsgrm_light(input_image, params : LSGRMParams, out_seg, n_proc=None, memory= print('[INFO] Output mode {}.'.format(mode)) if mode == 'vrt': + # Attention: cannot fill holes here! vrtopt = gdal.BuildVRTOptions(separate=False, srcNodata=0, VRTNodata=0) gdal.BuildVRT(out_seg, [x[0] for x in out_tiles], options=vrtopt) elif mode in ['raster', 'vector']: mos = otb.Registry.CreateApplication('Mosaic') mos.SetParameterStringList('il', [x[0] for x in out_tiles]) mos.SetParameterInt('nodata', 0) + mos.Execute() + + bm = otb.Registry.CreateApplication('BandMath') + bm.AddImageToParameterInputImageList('il', mos.GetParameterOutputImage('out')) + bm.AddImageToParameterInputImageList('il', in_img.GetParameterOutputImage('out')) + bm.SetParameterString('exp', 'im1b1==0 && im2b1!=0') + bm.Execute() + + holes = bm.ExportImage('out') + holes['array'], nholes = label(holes['array'], background=0, connectivity=1, return_num=True) + holes['array'][holes['array']!=0] += cumul_label + holes['array'] = np.ascontiguousarray(holes['array']).astype(float) + + # assuming nodata for input image always 0 here + holes_img = otb.Registry.CreateApplication('ExtractROI') + holes_img.ImportImage('in', holes) + holes_img.Execute() + + out_img = otb.Registry.CreateApplication('BandMath') + out_img.AddImageToParameterInputImageList('il', mos.GetParameterOutputImage('out')) + out_img.AddImageToParameterInputImageList('il', holes_img.GetParameterOutputImage('out')) + out_img.SetParameterString('exp', 'im1b1+im2b1') + if mode == 'raster': - mos.SetParameterOutputImagePixelType('out', otb.ImagePixelType_uint32) - mos.SetParameterString('out', out_seg) - mos.ExecuteAndWriteOutput() + out_img.SetParameterOutputImagePixelType('out', otb.ImagePixelType_uint32) + out_img.SetParameterString('out', out_seg) + out_img.ExecuteAndWriteOutput() elif mode == 'vector': - mos.Execute() + out_img.Execute() vec = otb.Registry.CreateApplication('SimpleVectorization') - vec.SetParameterInputImage('in', mos.GetParameterOutputImage('out')) + vec.SetParameterInputImage('in', out_img.GetParameterOutputImage('out')) vec.SetParameterString('out', out_seg) vec.ExecuteAndWriteOutput() if remove_tiles_if_useless: [os.remove(x[0]) for x in out_tiles] - return out_seg - - - + return out_seg, cumul_label + nholes def lsgrm(input_image, params : LSGRMParams, out_seg, n_proc=None, memory=None, roi=None, remove_graph=True, force_parallel=False): # Check output file type -- GitLab