From 29c95557553dd9bda01c7960557a10caed8a61ae Mon Sep 17 00:00:00 2001 From: "Hannes F. Kuchelmeister" Date: Mon, 12 Jul 2021 18:39:42 +0200 Subject: [PATCH] redo registration to be more generic --- situr/registration/__init__.py | 1 + situr/registration/channel_registration.py | 33 +++----------------- situr/registration/registration.py | 35 ++++++++++++++++++++++ situr/registration/round_registration.py | 6 ++++ 4 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 situr/registration/registration.py create mode 100644 situr/registration/round_registration.py diff --git a/situr/registration/__init__.py b/situr/registration/__init__.py index e69de29..d8912c1 100644 --- a/situr/registration/__init__.py +++ b/situr/registration/__init__.py @@ -0,0 +1 @@ +from .registration import Registration, RegistrationFunction, FilterregRegistrationFunction diff --git a/situr/registration/channel_registration.py b/situr/registration/channel_registration.py index 576c339..be6050d 100644 --- a/situr/registration/channel_registration.py +++ b/situr/registration/channel_registration.py @@ -1,34 +1,9 @@ -import abc -import open3d as o3 -from probreg import filterreg -from situr.image import extend_dim - -from situr.transformation import ScaleRotateTranslateChannelTransform +from situr.registration import Registration -class ChannelRegistration: - __metaclass__ = abc.ABCMeta - - def do_registration(self, situ_img, reference_channel=0): +class ChannelRegistration(Registration): + def do_channel_registration(self, situ_img, reference_channel=0): # For each channel (except nucleus) compute transform compared to reference_channel # Add Channel transformation to Channel + # TODO: implement pass - - @abc.abstractmethod - def register_single_channel(self, peaks_data, reference_peaks): - """Performs the channel registration on an image. Expects the peaks in each image as input.""" - raise NotImplementedError( - self.__class__.__name__ + '.register_single_channel') - - -class FilterregChannelRegistration(ChannelRegistration): - def register_single_channel(self, data_peaks, reference_peaks): - source = o3.geometry.PointCloud() - source.points = o3.utility.Vector3dVector(extend_dim(data_peaks)) - target = o3.geometry.PointCloud() - target.points = o3.utility.Vector3dVector(extend_dim(reference_peaks)) - - registration_method = filterreg.registration_filterreg - tf_param, _, _ = filterreg.registration_filterreg(source, target) - - return ScaleRotateTranslateChannelTransform(transform_matrix=tf_param.rot[0:2, 0:2], scale=tf_param.scale, offset=tf_param.t[0:2]) diff --git a/situr/registration/registration.py b/situr/registration/registration.py new file mode 100644 index 0000000..19cc00c --- /dev/null +++ b/situr/registration/registration.py @@ -0,0 +1,35 @@ +import abc +import open3d as o3 +from probreg import filterreg + +from situr.image import extend_dim +from situr.transformation import ScaleRotateTranslateChannelTransform + + +class RegistrationFunction: + __metaclass__ = abc.ABCMeta + + def __init__(self, transormation_type=ScaleRotateTranslateChannelTransform): + self.transormation_type = transormation_type + + @abc.abstractmethod + def do_registration(self, data_peaks, reference_peaks): + raise NotImplementedError(self.__class__.__name__ + '.do_registration') + + +class FilterregRegistrationFunction(RegistrationFunction): + def do_registration(self, data_peaks, reference_peaks): + source = o3.geometry.PointCloud() + source.points = o3.utility.Vector3dVector(extend_dim(data_peaks)) + target = o3.geometry.PointCloud() + target.points = o3.utility.Vector3dVector(extend_dim(reference_peaks)) + + registration_method = filterreg.registration_filterreg + tf_param, _, _ = filterreg.registration_filterreg(source, target) + + return self.transormation_type(transform_matrix=tf_param.rot[0:2, 0:2], scale=tf_param.scale, offset=tf_param.t[0:2]) + + +class Registration: + def __init__(self, registration_function): + self.registration_function = registration_function diff --git a/situr/registration/round_registration.py b/situr/registration/round_registration.py new file mode 100644 index 0000000..3b0cb8f --- /dev/null +++ b/situr/registration/round_registration.py @@ -0,0 +1,6 @@ +class RoundRegistration: + def do_round_registration(self, situ_tile, reference_channel=0): + # For each channel (except nucleus) compute transform compared to reference_channel + # Add Channel transformation to Channel + # TODO: implement + pass