65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
# \file Differential.py
|
|
# \brief TODO
|
|
# \author Florent Guiotte <florent.guiotte@gmail.com>
|
|
# \version 0.1
|
|
# \date 16 avril 2018
|
|
#
|
|
# TODO details
|
|
|
|
from ld2dap.core import Filter, Stack
|
|
import numpy as np
|
|
|
|
class Differential(Filter):
|
|
def __init__(self, overflow='auto'):
|
|
super().__init__(self.__class__.__name__)
|
|
self.overflow = overflow
|
|
|
|
def _process(self, data, metadata):
|
|
self.logger.info('Run differential on stack of size {}'.format(data.shape))
|
|
raster_list = list()
|
|
metadata_new = list()
|
|
|
|
offset = 0
|
|
for stack in metadata:
|
|
self.logger.debug('{}'.format(stack))
|
|
overflow = (data[:, :, stack.begin:stack.end-1] >
|
|
data[:, :, stack.begin+1:stack.end]).any() and \
|
|
str(data.dtype).startswith('u')
|
|
|
|
dtype = data.dtype
|
|
if overflow:
|
|
self.logger.warn('Overflow detected')
|
|
if self.overflow == 'auto':
|
|
dtype = np.dtype(str(data.dtype).lstrip('u'))
|
|
self.logger.info('Changing dtype from {} to {}'.format(
|
|
data.dtype, dtype))
|
|
|
|
raster_list.append(np.subtract(data[:, :, stack.begin+1:stack.end],
|
|
data[:, :, stack.begin:stack.end-1], dtype=dtype))
|
|
|
|
size_new = stack.end - stack.begin - 1
|
|
stack_new = Stack(offset, size_new)
|
|
|
|
for i in range(len(stack_new.desc)):
|
|
desc = stack.desc[i].copy()
|
|
desc.append(':Differential:')
|
|
desc.extend(stack.desc[i+1])
|
|
stack_new.desc[i] = desc
|
|
metadata_new.append(stack_new)
|
|
|
|
for i in range(len(stack_new.symb)):
|
|
symb = list() #['D(']
|
|
symb.extend(stack.symb[i])
|
|
symb.append(' - ')
|
|
symb.extend(stack.symb[i+1])
|
|
#symb.append(')')
|
|
stack_new.symb[i] = symb
|
|
|
|
offset += size_new
|
|
|
|
data = np.dstack(raster_list)
|
|
|
|
return data, metadata_new
|