Skip to content
Snippets Groups Projects

subtract dark data

Merged Guillaume HEUSCH requested to merge dark-subtraction into master
1 file
+ 67
0
Compare changes
  • Side-by-side
  • Inline
+ 67
0
@@ -89,6 +89,10 @@ class Stream():
def get_available_filters(self):
return Stream.filters
# get parent
def get_parent(self):
return self.parent
################################################################################
# filter decorator
def stream_filter(name):
@@ -392,6 +396,42 @@ class StreamReproject(StreamFilter):
self.camera_matrix,
self.dist_coeffs)
### subtract dark frame ###
@stream_filter('subtract_dark')
class StreamSubtractDark(StreamFilter):
def __init__(self, name, parent):
super().__init__(name=name, parent=parent)
def process_frame(self, data, index):
# tried to reproduce the hack in bob.db.batl2.loader.py:284
# not sure if it's ok though ...
if 'swir' in self.name:
index = 0
data = data[0]
dtype = data.dtype
data = data.astype(np.float)
# this should probably be handled in a better way
parent = self.parent
name = self.name
while(not isinstance(parent, StreamFile)):
if isinstance(parent, Stream):
name = parent.name
parent = parent.get_parent()
dark_data = parent.load_dark_data(name, index)
dark_data = dark_data[0,0].astype(np.float)
data = data - dark_data
data[data < 0.] = 0.
data = np.stack([data]).astype(dtype)
return data
class StreamCrop(StreamFilter):
pass
@@ -460,6 +500,7 @@ class StreamFile():
indices = []
# TODO load only relevant data if cropped
if isinstance(index, tuple):
index = index[0]
@@ -481,6 +522,32 @@ class StreamFile():
raise Exception('index can only be int, slice, tuple or list')
return None
def load_dark_data(self, stream_name, index):
data_config = self.get_stream_config(stream_name)
data_path = data_config['path_dark']
if isinstance(index, tuple):
index = index[0]
print('WARNING: cropping not yet implemented')
if isinstance(index, int):
data = self.hdf5_file.lread(data_path, index)
data = np.stack([data])
return data
elif isinstance(index, slice):
if index.step == None:
indices = list(range(index.start, index.stop))
else:
indices = list(range(index.start, index.stop, index.step))
data = np.stack([self.hdf5_file.lread(data_path, i) for i in indices])
return data
elif isinstance(index, list):
return np.stack([self.hdf5_file.lread(data_path, i) for i in index])
else:
raise Exception('index can only be int, slice, tuple or list')
return None
def stream(self, name):
return Stream(name, self)
Loading