From b0ea86e6cb13db86ee38d6089239807b66976062 Mon Sep 17 00:00:00 2001 From: Karamaz0V1 Date: Mon, 27 Aug 2018 11:04:20 +0200 Subject: [PATCH] Merger Node Complete --- ld2dap/LocalFeatures.py | 37 +------------------------- ld2dap/Merger.py | 57 +++++++++++++++++++++++++++++++++++++++++ ld2dap/__init__.py | 1 + ld2dap/core/Stacker.py | 48 ++++++++++++++++++++++++++++++++++ ld2dap/core/__init__.py | 1 + 5 files changed, 108 insertions(+), 36 deletions(-) create mode 100644 ld2dap/Merger.py create mode 100644 ld2dap/core/Stacker.py diff --git a/ld2dap/LocalFeatures.py b/ld2dap/LocalFeatures.py index be9ab83..2da6a09 100644 --- a/ld2dap/LocalFeatures.py +++ b/ld2dap/LocalFeatures.py @@ -8,7 +8,7 @@ # # TODO details -from ld2dap.core import Filter, Stack +from ld2dap.core import Filter, Stack, Stacker import numpy as np class LocalFeatures(Filter): @@ -57,38 +57,3 @@ def create_patches(array, patch_size=3): stack.append(offset) return np.stack(stack, axis=-1) -class Stacker: - def __init__(self): - self.offset = 0 - self.data_list = list() - self.metadata_list = list() - - def auto_stack(self, data, old_stack, desc_str, symb_str): - if data.shape[-1] != (old_stack.end - old_stack.begin): - raise ValueError("Mismatch between data shape and stack length") - - new_desc = list() - for d in old_stack.desc: - new_desc.append(d.copy()) - new_desc[-1].append(desc_str) - - new_symb = list() - for s in old_stack.symb: - new_symb.append([symb_str + '(']) - new_symb[-1].extend(s.copy()) - new_symb[-1].append(')') - - self.stack(data, new_desc, new_symb) - - def stack(self, data, desc, symb): - size_new = data.shape[-1] - stack_new = Stack(self.offset, size_new) - self.offset += size_new - stack_new.desc = desc - stack_new.symb = symb - self.data_list.append(data) - self.metadata_list.append(stack_new) - - def pack(self): - return np.dstack(self.data_list), self.metadata_list - diff --git a/ld2dap/Merger.py b/ld2dap/Merger.py new file mode 100644 index 0000000..56eb480 --- /dev/null +++ b/ld2dap/Merger.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# \file Merger.py +# \brief TODO +# \author Florent Guiotte +# \version 0.1 +# \date 24 août 2018 +# +# TODO details + +from ld2dap.core import Filter, Output, Stacker +import numpy as np + +class Merger(Filter): + def __init__(self): + super().__init__(self.__class__.__name__) + """Merger Node, merge two stream inputs""" + self.data = None + self.metadata = None + self.second = self.SecondInput(self) + + def process(self, data=None, metadata=None): + """Override the Input override""" + if data is not None: + self.logger.info('Register first input') + self.data = data + self.metadata = metadata + else: + self.logger.info('Register second input') + + if self.second.data is None or self.data is None: + return + + self.logger.info('Merging inputs') + offset = self.data.shape[-1] + data = np.dstack((self.data, self.second.data)) + metadata = self.metadata + + for stack in self.second.metadata: + stack.begin += offset + stack.end += offset + metadata.append(stack) + + for output in self.outputs: + output.process(data, [x.copy() for x in metadata]) + + class SecondInput(Output): + def __init__(self, merger): + super().__init__(self.__class__.__name__) + self.merger = merger + self.data = None + self.metadata = None + + def _process(self, data, metadata): + self.data = data + self.metadata = metadata + self.merger.process() diff --git a/ld2dap/__init__.py b/ld2dap/__init__.py index 19974a2..11766bb 100644 --- a/ld2dap/__init__.py +++ b/ld2dap/__init__.py @@ -10,6 +10,7 @@ from .AttributeProfiles import AttributeProfiles from .SelfDualAttributeProfiles import SelfDualAttributeProfiles +from .Merger import Merger from .LocalFeatures import LocalFeatures from .Treshold import Treshold from .LoadTIFF import LoadTIFF diff --git a/ld2dap/core/Stacker.py b/ld2dap/core/Stacker.py new file mode 100644 index 0000000..5ef4ebf --- /dev/null +++ b/ld2dap/core/Stacker.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# \file %filename%.py +# \brief TODO +# \author Florent Guiotte +# \version 0.1 +# \date 27 août 2018 +# +# TODO details + +import numpy as np +from .Stack import Stack + +class Stacker: + def __init__(self): + self.offset = 0 + self.data_list = list() + self.metadata_list = list() + + def auto_stack(self, data, old_stack, desc_str, symb_str): + if data.shape[-1] != (old_stack.end - old_stack.begin): + raise ValueError("Mismatch between data shape and stack length") + + new_desc = list() + for d in old_stack.desc: + new_desc.append(d.copy()) + new_desc[-1].append(desc_str) + + new_symb = list() + for s in old_stack.symb: + new_symb.append([symb_str + '(']) + new_symb[-1].extend(s.copy()) + new_symb[-1].append(')') + + self.stack(data, new_desc, new_symb) + + def stack(self, data, desc, symb): + size_new = data.shape[-1] + stack_new = Stack(self.offset, size_new) + self.offset += size_new + stack_new.desc = desc + stack_new.symb = symb + self.data_list.append(data) + self.metadata_list.append(stack_new) + + def pack(self): + return np.dstack(self.data_list), self.metadata_list + diff --git a/ld2dap/core/__init__.py b/ld2dap/core/__init__.py index cbc170d..69703a1 100644 --- a/ld2dap/core/__init__.py +++ b/ld2dap/core/__init__.py @@ -12,3 +12,4 @@ from .Output import Output from .Input import Input from .Filter import Filter from .Stack import Stack +from .Stacker import Stacker