class WorldTest(TestCase): def setUp(self): ev.events self.world = World() self.world.register_listener(ev) def tearDown(self): self.world.unregister_listener(ev) ev.events del self.world def test_world_objects(self): wo = WorldObject(name='o', data=1) assert wo.name == 'o' assert wo.data == 1 def test_world(self): obj = self.world.add(1, 'a') events = ev.events self.check_events(events, names=['world_object_changed'], values={0: {0: self.world, 1: None, 2: obj}} ) attribute_dict = dict(name='attr1', value=1, interface='IInt', label="Attribute 1") final_dict = dict(name='attr1', value=1, interface='IInt', label="Attribute 1", constraints=None) obj.set_attribute(**attribute_dict) events = ev.events self.check_events(events, names=['world_object_item_changed'], values={0: {0: self.world, 1: obj, 2: "attribute", 3: None, 4: final_dict}} ) assert obj['attr1'] == attribute_dict['value']
def clear_namespace(self, interpreter, project): if project is None: return sys.path = self.old_syspath for k in project.ns.keys() + ['world', 'data', 'project']: if k in interpreter.user_ns: del interpreter.user_ns[k] from openalea.core.world import World world = World() world.clear()
class WorldTest(TestCase): def setUp(self): ev.events self.world = World() self.world.register_listener(ev) def tearDown(self): self.world.unregister_listener(ev) ev.events del self.world def test_world_objects(self): wo = WorldObject(name='o', data=1) assert wo.name == 'o' assert wo.data == 1 def test_world(self): obj = self.world.add(1, 'a') events = ev.events self.check_events(events, names=['world_object_changed'], values={0: { 0: self.world, 1: None, 2: obj }}) attribute_dict = dict(name='attr1', value=1, interface='IInt', label="Attribute 1") final_dict = dict(name='attr1', value=1, interface='IInt', label="Attribute 1", constraints=None) obj.set_attribute(**attribute_dict) events = ev.events self.check_events(events, names=['world_object_item_changed'], values={ 0: { 0: self.world, 1: obj, 2: "attribute", 3: None, 4: final_dict } }) assert obj['attr1'] == attribute_dict['value']
def add_objects_with_attributes_set(): """ Attributes are defined before adding object to world. Results is less signals sent by world """ world = World() world.clear() obj1 = WorldObject("obj1", 1) obj2 = WorldObject("obj2", 2) obj1.set_attribute('a1', 1, 'IInt', constraints=c1) obj1.set_attribute('a2', True, 'IBool') obj2.set_attribute('b1', 2.34, 'IFloat', constraints=c2) world["obj1"] = obj1 world["obj2"] = obj2
def update_namespace(self, interpreter): """ Definition: Update namespace """ if self._cproject: if self._cproject.path.exists(): os.chdir(self._cproject.path) sys.path.insert(0, str(self._cproject.path / 'lib')) else: os.chdir(self.tmpdir) sys.path.insert(0, str(self.tmpdir / 'lib')) interpreter.user_ns.update(self._cproject.ns) interpreter.user_ns['project'] = self._cproject interpreter.user_ns['data'] = self._cproject.path / 'data' from openalea.core.world import World world = World() world.update_namespace(interpreter)
def add_objects_then_attributes(): world = World() world["obj1"] = 1 world["obj2"] = 2 obj1 = world["obj1"] obj2 = world["obj2"] obj1.set_attribute('a1', 1, 'IInt', constraints=c1) obj1.set_attribute('a2', True, 'IBool') obj2.set_attribute('b1', 2.34, 'IFloat', constraints=c2)
def setUp(self): ev.events self.world = World() self.world.register_listener(ev)
def initialize(self): self.world = World() self.world.register_listener(self)
class ImageStackViewer(QtGui.QTabWidget, AbstractListener): def __init__(self): QtGui.QTabWidget.__init__(self) AbstractListener.__init__(self) self.setAcceptDrops(True) self._image = {} self._viewer = {} self._create_connections() def initialize(self): self.world = World() self.world.register_listener(self) def notify(self, sender, event=None): signal, data = event if signal == 'world_sync': self.set_world(data) elif signal == 'world_object_removed': world, old = data self.remove_world_object(world, old) elif signal == 'world_object_changed': world, old, new = data self.set_world_object(world, new) elif signal == 'world_object_item_changed': world, obj, item, old, new = data if item == 'attribute': self.update_world_object(world, obj, item, old, new) def set_image(self, name, image): if name in self._viewer: viewer = self._viewer[name] else: viewer = ImageStackViewerWidget() viewer.setAttribute(QtCore.Qt.WA_DeleteOnClose) connect(viewer, viewer.stackChanged, self._on_stack_changed) self._viewer[name] = viewer self._image[viewer] = name self.addTab(viewer, name) viewer.setValue(image) def remove_image(self, name): if name in self._viewer: viewer = self._viewer[name] disconnect(viewer, viewer.stackChanged, self._on_stack_changed) self.removeTab(self.indexOf(viewer)) viewer.close() del self._image[viewer] del self._viewer[name] def set_world_object(self, world, world_object): if not isinstance(world_object.data, SpatialImage): return self.set_image(world_object.name, world_object.data) def remove_world_object(self, world, world_object): if not isinstance(world_object.data, SpatialImage): return self.set_image(world_object.name, world_object.data) def set_world(self, world): # Clear viewer for image in self._viewer.keys(): self.remove_image(image) # Set object in viewer for obj_name, world_object in world.items(): self.set_world_object(world, world_object) def update_world_object(self, world, obj, item, old, new): attr_name = new['name'] if attr_name.endswith('plane_position'): axis = list('xyz').index(attr_name[0]) position = new['value'] if obj.name in self._viewer: viewer = self._viewer[obj.name] viewer.change_axis(axis) viewer.slice_changed(position) def _create_connections(self): self.currentChanged.connect(self._on_current_image_changed) def _on_current_image_changed(self, idx): pass def _on_stack_changed(self, stack): name = self._image[self.sender()] if stack: world_object = self.world[name] cut_plane = '%s_plane_position' % ('xyz'[stack['axis']]) world_object.set_attribute(cut_plane, stack['slice'])
def __init__(self, parent=None): # super(Viewer, self).__init__() AbstractListener.__init__(self) view3D.__init__(self, parent=parent) self.setAccessibleName("3DViewer") self.setMinimumSize(100, 100) self.autofocus = True self._fps = False self.axis = False self.grid = True actionResetZoom = QtGui.QAction(QtGui.QIcon(":/images/resources/resetzoom.png"), "Home", self) self.actionAutoFocus = QtGui.QAction(QtGui.QIcon(":/images/resources/resetzoom.png"), "Auto Focus", self) self.actionAutoFocus.setCheckable(True) self.actionAutoFocus.setChecked(self.autofocus) self.actionAutoFocus.changed.connect(self._on_autofocus_changed) actionZoomOut = QtGui.QAction(QtGui.QIcon(":/images/resources/zoomout.png"), "Zoom Out", self) actionZoomIn = QtGui.QAction(QtGui.QIcon(":/images/resources/zoomin.png"), "Zoom In", self) actionShowAxis = QtGui.QAction(QtGui.QIcon(":/images/resources/axis.png"), "Show Axis", self) actionShowGrid = QtGui.QAction(QtGui.QIcon(":/images/resources/grid.png"), "Show Grid", self) actionRadius = QtGui.QAction(QtGui.QIcon(":/images/resources/growth2.png"), "Focus", self) actionShowFps = QtGui.QAction(QtGui.QIcon(":/images/resources/fps.png"), "Show FPS", self) actionBlack = QtGui.QAction(QtGui.QIcon(""), "Bg Black", self) actionWhite = QtGui.QAction(QtGui.QIcon(""), "Bg White", self) actionShowAxis.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl+A", None, QtGui.QApplication.UnicodeUTF8)) actionShowGrid.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl+I", None, QtGui.QApplication.UnicodeUTF8)) actionRadius.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl+M", None, QtGui.QApplication.UnicodeUTF8)) actionResetZoom.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl+0", None, QtGui.QApplication.UnicodeUTF8)) actionZoomOut.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl+-", None, QtGui.QApplication.UnicodeUTF8)) actionZoomIn.setShortcut( QtGui.QApplication.translate("MainWindow", "Ctrl++", None, QtGui.QApplication.UnicodeUTF8)) QtCore.QObject.connect(actionResetZoom, QtCore.SIGNAL('triggered(bool)'), self.resetzoom) QtCore.QObject.connect(actionZoomOut, QtCore.SIGNAL('triggered(bool)'), self.zoomout) QtCore.QObject.connect(actionZoomIn, QtCore.SIGNAL('triggered(bool)'), self.zoomin) QtCore.QObject.connect(actionShowAxis, QtCore.SIGNAL('triggered(bool)'), self.show_hide_axis) QtCore.QObject.connect(actionShowGrid, QtCore.SIGNAL('triggered(bool)'), self.show_hide_grid) QtCore.QObject.connect(actionRadius, QtCore.SIGNAL('triggered(bool)'), self.update_radius) QtCore.QObject.connect(actionShowFps, QtCore.SIGNAL('triggered(bool)'), self.show_fps) QtCore.QObject.connect(actionBlack, QtCore.SIGNAL('triggered(bool)'), self.set_bg_black) QtCore.QObject.connect(actionWhite, QtCore.SIGNAL('triggered(bool)'), self.set_bg_white) world = World() world.register_listener(self) self.object_repr = {} self.object_scene = {} self.property = {} self._actions = [["Viewer", "Zoom", actionResetZoom, 0], ["Viewer", "Zoom", actionZoomOut, 0], ["Viewer", "Zoom", actionZoomIn, 0], ["Viewer", "Zoom", self.actionAutoFocus, 0], ["Viewer", "Camera", actionShowAxis, 0], ["Viewer", "Camera", actionShowGrid, 0], ["Viewer", "Camera", actionRadius, 0], ["Viewer", "Camera", actionBlack, 0], ["Viewer", "Camera", actionWhite, 0], #["Viewer", "Informations", actionShowFps, 1] ]
def nuclei_active_region_segmentation(input_img, positions, omega_energies=dict(intensity=1.0, gradient=1.5, smoothness=10000.0), intensity_min=20000., iterations=10, display=False): """ 3D extension of the multiple region extension of the binary level set implementation """ segmentation_start_time = time() print "--> Active region segmentation (", len(positions), " regions )" from copy import deepcopy reference_img = deepcopy(input_img) size = np.array(reference_img.shape) voxelsize = np.array(reference_img.voxelsize) if display: from openalea.core.world import World world = World() if omega_energies.has_key('gradient'): from scipy.ndimage.filters import gaussian_gradient_magnitude start_time = time() print " --> Computing image gradient" gradient = gaussian_gradient_magnitude( np.array(reference_img, np.float64), sigma=0.5 / np.array(reference_img.voxelsize)) gradient_img = SpatialImage(np.array(gradient, np.uint16), voxelsize=reference_img.voxelsize) end_time = time() print " <-- Computing image gradient [", end_time - start_time, " s]" start_time = time() print " --> Creating seed image" print positions.keys() seed_img = seed_image_from_points(size, voxelsize, positions, point_radius=1.0) regions_img = np.copy(seed_img) end_time = time() print " <-- Creating seed image (", len(np.unique( regions_img)) - 1, " regions ) [", end_time - start_time, " s]" if display: world.add(seed_img, 'active_regions_seeds', colormap='glasbey', voxelsize=voxelsize, alphamap='constant', volume=False, cut_planes=True) raw_input() for iteration in xrange(iterations): start_time = time() print " --> Active region energy gradient descent : iteration", iteration, " (", len( np.unique(regions_img)) - 1, " regions )" previous_regions_img = np.copy(regions_img) regions_img = active_regions_energy_gradient_descent( regions_img, reference_img, omega_energies=omega_energies, intensity_min=intensity_min, gradient_img=gradient) change = ((regions_img - previous_regions_img) != 0.).sum() / float( (regions_img > 1.).sum()) end_time = time() print " --> Active region energy gradient descent : iteration", iteration, " (Evolution : ", int( 100 * change), " %) ", "[", end_time - start_time, " s]" if display: world.add(regions_img, 'active_regions', colormap='invert_grey', voxelsize=voxelsize, intensity_range=(1, 2)) segmented_img = SpatialImage(regions_img, voxelsize=reference_img.voxelsize) if display: world.add(segmented_img, 'active_regions', colormap='glasbey', voxelsize=voxelsize, alphamap='constant') raw_input() segmentation_end_time = time() print "<-- Active region segmentation (", len( np.unique(segmented_img) ) - 1, " regions ) [", segmentation_end_time - segmentation_start_time, " s]" return segmented_img