class RigidTransformationSSD(): def __init__(self,target,source): self.target = target self.source = source self._resampled_source_cache = None self._resampled_source_need_update = True self._contruct_ilang_model() self._set_transformation(numpy.zeros((1,6))) def _contruct_ilang_model(self): self.ilang_model = ModelRigidSSD('RigidSSD') self.graph = ProbabilisticGraphicalModel(['target','source','transformation']) self.graph.set_nodes_given(['target','source'],True) self.graph.set_node_value('source',self.source.get_data()) self.graph.set_node_value('target',self.target.get_data()) self.graph.set_node_value('transformation',numpy.zeros((1,6))) self.graph.add_dependence(self.ilang_model,{'target':'target','source':'source','transformation':'transformation'}) self.sampler = Sampler(self.graph) def _set_transformation(self,transformation): self.graph.set_node_value('transformation',transformation) self._resampled_source_need_update = True def _get_transformation(self): return self.graph.get_node_value('transformation') def estimate_transformation(self,method=None,iterations=30000,trace=True,parameters=None, display_progress=True): if method!=None: self.sampler.set_node_sampling_method_manual('transformation',method) else: self.sampler.set_node_sampling_method_auto('transformation') last_sample = self.sampler.sample_node('transformation',nsamples=iterations,trace=trace) # This is not necessary, but it triggers the cache of the resampled source image: self._set_transformation(last_sample) return last_sample def resample_in_target_space(self,image): # FIXME #print "Resampling .." transformation = self._get_transformation() return image def _get_resampled_source(self): #FIXME: remove the next few lines if self.transformation.sum() != 0: return self.target if self._resampled_source_need_update: resampled_source = self.resample_in_target_space(self.source) self._resampled_source_cache = resampled_source self._resampled_source_need_update = False else: resampled_source = self._resampled_source_cache return resampled_source def display_in_browser(self,axis=0,shrink=256,rotate=90,subsample_slices=4,scale_factors=None): self.display(axis,shrink,rotate,scale_factors,open_browser=True) def display(self,axis=0,shrink=256,rotate=90,subsample_slices=4,scale_factors=None,open_browser=False): resampled = self.resampled_source D = MultipleVolumes([resampled,self.target], axis, shrink, rotate, subsample_slices, scale_factors, open_browser) return D.display() def _repr_html_(self): return self.display()._repr_html_() transformation = property(_get_transformation, _set_transformation, None) resampled_source = property(_get_resampled_source, None, None)
class RigidTransformationSSD(): def __init__(self, target, source): self.target = target self.source = source self._resampled_source_cache = None self._resampled_source_need_update = True self._contruct_ilang_model() self._set_transformation(numpy.zeros((1, 6))) def _contruct_ilang_model(self): self.ilang_model = ModelRigidSSD('RigidSSD') self.graph = ProbabilisticGraphicalModel( ['target', 'source', 'transformation']) self.graph.set_nodes_given(['target', 'source'], True) self.graph.set_node_value('source', self.source.get_data()) self.graph.set_node_value('target', self.target.get_data()) self.graph.set_node_value('transformation', numpy.zeros((1, 6))) self.graph.add_dependence( self.ilang_model, { 'target': 'target', 'source': 'source', 'transformation': 'transformation' }) self.sampler = Sampler(self.graph) def _set_transformation(self, transformation): self.graph.set_node_value('transformation', transformation) self._resampled_source_need_update = True def _get_transformation(self): return self.graph.get_node_value('transformation') def estimate_transformation(self, method=None, iterations=30000, trace=True, parameters=None, display_progress=True): if method != None: self.sampler.set_node_sampling_method_manual( 'transformation', method) else: self.sampler.set_node_sampling_method_auto('transformation') last_sample = self.sampler.sample_node('transformation', nsamples=iterations, trace=trace) # This is not necessary, but it triggers the cache of the resampled source image: self._set_transformation(last_sample) return last_sample def resample_in_target_space(self, image): # FIXME #print "Resampling .." transformation = self._get_transformation() return image def _get_resampled_source(self): #FIXME: remove the next few lines if self.transformation.sum() != 0: return self.target if self._resampled_source_need_update: resampled_source = self.resample_in_target_space(self.source) self._resampled_source_cache = resampled_source self._resampled_source_need_update = False else: resampled_source = self._resampled_source_cache return resampled_source def display_in_browser(self, axis=0, shrink=256, rotate=90, subsample_slices=4, scale_factors=None): self.display(axis, shrink, rotate, scale_factors, open_browser=True) def display(self, axis=0, shrink=256, rotate=90, subsample_slices=4, scale_factors=None, open_browser=False): resampled = self.resampled_source D = MultipleVolumes([resampled, self.target], axis, shrink, rotate, subsample_slices, scale_factors, open_browser) return D.display() def _repr_html_(self): return self.display()._repr_html_() transformation = property(_get_transformation, _set_transformation, None) resampled_source = property(_get_resampled_source, None, None)