ld2daps/ld2dap/LocalFeatures.py
2018-08-27 11:04:20 +02:00

60 lines
1.9 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# \file LocalFeatures.py
# \brief TODO
# \author Florent Guiotte <florent.guiotte@gmail.com>
# \version 0.1
# \date 23 août 2018
#
# TODO details
from ld2dap.core import Filter, Stack, Stacker
import numpy as np
class LocalFeatures(Filter):
def __init__(self, features=None, patch_size=3):
super().__init__(self.__class__.__name__)
self.features = features
self.patch_size = patch_size
def _process(self, data, metadata):
self.logger.info('Local Features Filtering')
stacker = Stacker()
for stack in metadata:
self.logger.debug('{}'.format(stack))
patches = create_patches(data[:,:,stack.begin:stack.end], self.patch_size)
for function in self.features:
self.logger.debug('Features function {}'.format(function.__name__))
features = function(patches, axis=-1)
stacker.auto_stack(features, stack,
'Local Features {}'.format(function.__name__),
'f^{{{}}}'.format(function.__name__))
return stacker.pack()
def create_patches(array, patch_size=3):
amp = int((patch_size - 1 ) / 2)
stack = list()
for i in range(-amp, amp+1):
ai = i if i > 0 else None
bi = i if i < 0 else None
ci = -bi if bi is not None else None
di = -ai if ai is not None else None
for j in range(-amp, amp+1):
offset = np.zeros_like(array)
#offset = np.empty(array.shape)
aj = j if j > 0 else None
bj = j if j < 0 else None
cj = -bj if bj is not None else None
dj = -aj if aj is not None else None
offset[ai:bi, aj:bj] = array[ci:di, cj:dj]
stack.append(offset)
return np.stack(stack, axis=-1)