'''OmeroLoadImages loads one or more images from OMERO.
This module retrieves all images in a dataset or plate from an OMERO server. It is also possible to load a single image (e.g. for testing your pipeline). Important note

In OMERO, images contain image planes. It is these image planes that are considered images in their own right in Cellprofiler. When this module refers to an image, it will mean a Cellprofiler image (= OMERO image plane) unless noted otherwise.

Running in headless mode

When run from the command line the module will not used the omero object id that is saved in the pipeline. It will use the image directory parameter instead. e.g.:

python CellProfiler.py -p mypipeline -i 1 In the above example the pipeline "mypipeline" will be run with "1" as omero object id.

OMERO

''' # CellProfiler is distributed under the GNU General Public License. # See the accompanying file LICENSE for details. # # Developed by the Broad Institute # Copyright 2003-2010 # # Please see the AUTHORS file for credits. # # Website: http://www.cellprofiler.org # module author: Bram Gerritsen # e-mail: b.gerritsen@nki.nl __version__="$Revision: 10415 $" import numpy as np import wx import traceback import cellprofiler.cpmodule as cpm import cellprofiler.cpimage as cpimage import cellprofiler.measurements as cpmeas import cellprofiler.settings as cps import cellprofiler.preferences as cpp #get the default cellprofiler image names for the different #channels of an omero image from the loadimages module from cellprofiler.modules.loadimages import default_cpimage_name import omero from omero.rtypes import rlong from omero.rtypes import rint from omero_version import omero_version #omero beta 4 versions that did not fully support High Content Screening (HCS) OMERO_VERSION4_PREHCS = ['Beta-4.0.1', 'Beta-4.0.2'] #omero beta 4.0.3 also requires the following import, #but that version identified itself with 'Beta-4.0.2' if omero_version in OMERO_VERSION4_PREHCS: #This import is required because of an issue with forward-declarations in Ice import omero_api_Gateway_ice DEFAULT_OMERO_PORT = 4063 INT_8 = "int8" UINT_8 = "uint8" INT_16 = "int16" UINT_16 = "uint16" INT_32 = "int32" UINT_32 = "uint32" FLOAT = "float" DOUBLE = "double" else: DEFAULT_OMERO_PORT = 4064 from omero.util.pixelstypetopython import * # strings for choice variables MS_IMAGE = 'Image' MS_DATASET = 'Dataset' MS_PLATE = 'Plate' # #Defaults for the module settings # DEFAULT_OMERO_HOST = 'localhost' DEFAULT_OMERO_USERNAME = '' DEFAULT_OMERO_PASSWORD = '' DEFAULT_OMERO_OBJECT = MS_IMAGE DEFAULT_OMERO_OBJECT_ID = 1 # The different categories that this module # provides measurements for. ''' The Dataset measurement category''' C_DATASET = 'OmeroDataset' ''' The Plate measurement category''' C_PLATE = 'OmeroPlate' ''' The Well measurement category''' C_WELL = 'OmeroWell' ''' The Image measurement category''' C_IMAGE = 'OmeroImage' ''' The Pixels measurement category''' C_PIXELS = 'OmeroPixels' #Features FTR_NAME = 'Name' FTR_ID = 'Id' FTR_ROW = 'Row' FTR_COLUMN = 'Column' FTR_Z = 'Z' FTR_C = 'C' FTR_T = 'T' '''The Dataset name measurement name''' M_DATASET_NAME = '%s_%s'%(C_DATASET, FTR_NAME) '''The Dataset id measurement name''' M_DATASET_ID = '%s_%s'%(C_DATASET, FTR_ID) '''The Plate name measurement name''' M_PLATE_NAME = '%s_%s'%(C_PLATE, FTR_NAME) '''The Plate id measurement name''' M_PLATE_ID = '%s_%s'%(C_PLATE, FTR_ID) '''The Well row measurement name''' M_WELL_ROW = '%s_%s'%(C_WELL, FTR_ROW) '''The Well column measurement name''' M_WELL_COLUMN = '%s_%s'%(C_WELL, FTR_COLUMN) '''The Well id measurement name''' M_WELL_ID = '%s_%s'%(C_WELL, FTR_ID) '''The Image name measurement name (note: name of the image in omero)''' M_IMAGE_NAME = '%s_%s'%(C_IMAGE, FTR_NAME) '''The Image id measurement name (note: image id of the image in omero)''' M_IMAGE_ID = '%s_%s'%(C_IMAGE, FTR_ID) '''The Pixels id measurement name ''' M_PIXELS_ID = '%s_%s'%(C_PIXELS, FTR_ID) '''The channel number ''' M_C = '%s_%s'%(cpmeas.C_METADATA, FTR_C) '''The Z depth measurement name ''' M_Z = '%s_%s'%(cpmeas.C_METADATA, FTR_Z) '''The Time index measurement name ''' M_T = '%s_%s'%(cpmeas.C_METADATA, FTR_T) '''The provider name for the omero image provider''' P_OMERO = "OmeroImageProvider" '''The version number for the __init__ method of the omero image provider''' V_OMERO = 1 def create_omero_gateway(host=DEFAULT_OMERO_HOST, port=DEFAULT_OMERO_PORT, username=DEFAULT_OMERO_USERNAME, password=DEFAULT_OMERO_PASSWORD): '''Connect to an omero server and create an omero gateway instance''' try: omero_client = omero.client(host, port) omero_session = omero_client.createSession(username, password) omero_gateway = omero_session.createGateway() except Exception, err: raise RuntimeError("Unable to connect to OMERO server %s@%s:%d"% (username, host, int(port)), err) return omero_client, omero_session, omero_gateway class OmeroLoadImages(cpm.CPModule): variable_revision_number = 1 module_name = 'OmeroLoadImages' category = 'File Processing' #Make the omero client object an attribute of this class, because otherwise the #Ice Communicator will be disconnected when the omero client goes out #of scope and is cleaned up by python's garbage collector omero_client = None omero_session = None omero_gateway = None def create_settings(self): self.omero_host = cps.Text("Host address", DEFAULT_OMERO_HOST, doc="""Host address of an omero server. Can be an ip-address or a hostname.""") self.omero_port = cps.Integer("Port", DEFAULT_OMERO_PORT, doc="""Port of an omero server.""") self.omero_username = cps.Text("Username", DEFAULT_OMERO_USERNAME, doc="""Username is required for login into an omero server.""") self.omero_password = cps.Text("Password", DEFAULT_OMERO_PASSWORD, doc="""Password is required for login into an omero server.""") self.omero_object = cps.Choice("Object to load", [MS_IMAGE, MS_DATASET, MS_PLATE], DEFAULT_OMERO_OBJECT) self.omero_object_id = cps.Integer("Object id", DEFAULT_OMERO_OBJECT_ID, doc="""This is a number that omero uses to uniquely identify an object, be it a dataset, plate, or image.""") self.load_channels = cps.DoSomething("", "Load channels from OMERO", self.load_channels) # All the omero images that are loaded are assumed to have # as many or more channels than the highest channel number # the user specifies. self.channels = [] self.channel_count = cps.HiddenCount(self.channels, "Channel count") # Add the first channel self.add_channelfn(False) # Button for adding other channels self.add_channel = cps.DoSomething("", "Add another channel", self.add_channelfn) def create_omero_gateway(self): '''Create omero gateway based on module settings ''' if self.omero_client != None: self.omero_client.closeSession() self.omero_client, self.omero_session, self.omero_gateway = create_omero_gateway( self.omero_host.value, self.omero_port.value, self.omero_username.value, self.omero_password.value) def get_omero_plate(self, plate_id): '''Get plate from omero id - id of plate in omero ''' return omero_session.getQueryService().findByString("Plate", "id", plate_id); def load_channels(self): '''Add and set channels based on an image from omero ''' try: self.create_omero_gateway() id = int(self.omero_object_id.value) if self.omero_object == MS_IMAGE: omero_image = self.omero_gateway.getImage(id) elif self.omero_object == MS_DATASET: images_from_dataset = self.get_images_from_dataset(id, 1) if len(images_from_dataset) == 0: omero_image = None else: omero_image = images_from_dataset[0] elif self.omero_object == MS_PLATE: wells_from_plate = self.get_wells_from_plate(id, 1) if len(wells_from_plate) == 0: omero_image = None else: omero_well = wells_from_plate[0] omero_image = omero_well.getWellSample(0).getImage() if omero_image is None: # Don't say plate or dataset not found as they might still exist but do not have # images attached to them. Another reason for not being able to find images is # because the omero account used does not have permissions to retrieve the image # or images. raise RuntimeError("No image found for %s with id %d"%(self.omero_object,id)) omero_image_id = omero_image.getId().getValue() pixels = self.omero_gateway.getPixelsFromImage(omero_image_id)[0] #The pixels doesn't have all the (logical) channels #because of lazy loading. So the pixels is requested #again, but in a way to get the channels as well. pixels = self.omero_gateway.getPixels(pixels.getId().getValue()) #repopulate channels based on the retrieved pixels. #note: cannot say self.channels=[] because the channel_count #is associated with the object self.channels refers to. for channel in self.channels[:]: self.channels.remove(channel) omero_channels = [channel for channel in pixels.iterateChannels()] number_of_channels = pixels.getSizeC().getValue() for channel_number in range(0, number_of_channels): omero_channel = omero_channels[channel_number].getLogicalChannel() #load default cpimage name in case the logical channel name # cannot be retrieved. e.g. when the logical channel name is null try: omero_channel_name = omero_channel.getName().getValue().strip() except: omero_channel_name = default_cpimage_name(channel_number) self.add_channelfn(channel_number != 0) self.channels[-1].cpimage_name.set_value(omero_channel_name) self.channels[-1].channel_number.set_value(str(channel_number)) #Close the session just in case the user decides not to run #the pipeline. self.omero_client.closeSession() self.omero_client = None wx.MessageBox("Retrieved %d channel(s) from OMERO"%number_of_channels, "", wx.ICON_INFORMATION) except: wx.MessageBox(traceback.format_exc(limit=0), "Exception", wx.ICON_ERROR); def add_channelfn(self, can_remove=True): '''Add another image channel can_remove - true if we are allowed to remove this channel ''' group = cps.SettingsGroup() self.channels.append(group) #Check which cellprofiler image we are in the group #(each channel translates to a single cellprofiler image) cpimg_index = 0 for channel in self.channels: if id(channel) == id(group): break cpimg_index += 1 group.append("divider", cps.Divider(line=True)) group.append("cpimage_name", cps.ImageNameProvider( 'Image name', default_cpimage_name(cpimg_index))) channel_numbers = [ str(x) for x in range(0, max(10, len(self.channels)+2)) ] group.append("channel_number", cps.Choice( "Channel number:", channel_numbers, channel_numbers[len(self.channels)-1], doc = """(Used only for multichannel images) The channels of a multichannel image are numbered starting from 0 (zero). Each channel is a greyscale image, acquired using different illumination sources and/or optics. Use this setting to pick the channel to associate with the image or images you load from OMERO.""")) group.can_remove = can_remove if can_remove: group.append("remover", cps.RemoveSettingButton( "Remove this channel", "Remove channel", self.channels, group)) def settings(self): varlist = [self.omero_host, self.omero_port, self.omero_username, self.omero_password, self.omero_object, self.omero_object_id, self.channel_count] for channel in self.channels: varlist += [channel.cpimage_name, channel.channel_number] return varlist def visible_settings(self): varlist = [self.omero_host, self.omero_port, self.omero_username, self.omero_password, self.omero_object, self.omero_object_id, self.load_channels] for channel in self.channels: varlist += [channel.divider, channel.cpimage_name, channel.channel_number] if channel.can_remove: varlist += [channel.remover] varlist.append(self.add_channel) return varlist def validate_module(self, pipeline): '''Validate a module's settings''' for setting in (self.omero_host, self.omero_port, self.omero_username, self.omero_password): if setting.value == '': raise cps.ValidationError("Cannot continue if \"%s\" is not set."%setting.get_text(), setting) def is_load_module(self): '''This module creates image sets so it is a load module''' return True def prepare_run(self, pipeline, image_set_list, frame): '''Set up omero image providers inside the image_set_list''' if pipeline.in_batch_mode(): #TODO: Rewrite the OmeroImageProvider such that it can be used in batch mode #e.g. omero session keys could be used to attach to existing sessions to #keep OmeroImageProviders from creating a new session every time an image should be loaded return False if cpp.get_headless(): print 'OmeroLoadImages running in headless mode: image directory parameter will be used as omero object id' self.omero_object_id.set_value(int(cpp.get_default_image_directory())) print 'omero object id = %d'%self.omero_object_id.value print 'omero object type = %s'%self.omero_object.value self.create_omero_gateway() if self.omero_object == MS_IMAGE: omero_image_list = [self.omero_gateway.getImage(self.omero_object_id.value)] elif self.omero_object == MS_DATASET: #Get dataset without leaves(=images&pixels) dataset = self.omero_gateway.getDataset(self.omero_object_id.value, False) self.dataset_name = dataset.getName().getValue() omero_image_list = self.get_images_from_dataset(self.omero_object_id.value) elif self.omero_object == MS_PLATE: self.wells = self.get_wells_from_plate(self.omero_object_id.value) self.plate_name = self.wells[0].getPlate().getName().getValue() omero_image_list = [] for well in self.wells: for wellsample in well.iterateWellSamples(): omero_image_list.append(wellsample.getImage()) #get names and pixels from omero images pixels_list = [] for omero_image in omero_image_list: image_id = omero_image.getId().getValue() pixels_list += self.omero_gateway.getPixelsFromImage(image_id) #add images to image sets image_set_count = len(pixels_list) for i in range(0, image_set_count): image_set = image_set_list.get_image_set(i) pixels = pixels_list[i] pixels_id = pixels.getId().getValue() sizeZ = pixels.getSizeZ().getValue() sizeC = pixels.getSizeC().getValue() sizeT = pixels.getSizeT().getValue() for channel in self.channels: for z in range(0, sizeZ): for t in range(0, sizeT): c = int(channel.channel_number.value) self.save_image_set_info(image_set, channel.cpimage_name.value, P_OMERO, V_OMERO, self.omero_gateway, pixels_id, z, c, t) return True def get_images_from_dataset(self, dataset_id, limit=None): '''Get images from dataset limit - maximum number of images to retrieve ''' q = self.omero_session.getQueryService() p = omero.sys.Parameters() p.map = {} p.map["oid"] = rlong(long(dataset_id)) if limit != None: f = omero.sys.Filter() f.limit = rint(int(limit)) p.theFilter = f sql = "select im from Image im " \ "left outer join fetch im.datasetLinks dil left outer join fetch dil.parent d " \ "where d.id = :oid order by im.id asc" return q.findAllByQuery(sql, p) def get_wells_from_plate(self, plate_id, limit=None): ''' Retrieves every well of a plate that has an image attached to it (via a wellsample of course). plate_id - id of the plate limit - maximum number of wells to retrieve ''' q = self.omero_session.getQueryService() p = omero.sys.Parameters() p.map = {} p.map["oid"] = rlong(long(plate_id)) if limit != None: f = omero.sys.Filter() f.limit = rint(int(limit)) p.theFilter = f sql = "select well from Well as well "\ "left outer join fetch well.plate as pt "\ "left outer join fetch well.wellSamples as ws " \ "inner join fetch ws.image as img "\ "where well.plate.id = :oid" return q.findAllByQuery(sql,p) def save_image_set_info(self, image_set, image_name, provider, version, *args): '''Write out the details for creating an image provider Write information to the image set list legacy fields for saving the state needed to create an image provider. image_set - create a provider on this image set image_name - the image name for the image provider - the name of an image set provider (the name will be read by load_image_set_info to create the actual provider) version - the version # of the provider, in case the arguments change args - string arguments that will be passed to the provider's init fn ''' if provider != P_OMERO: raise NotImplementedError( "provider %s has not been implemented by this module"%provider) d = self.get_dictionary(image_set) d[image_name] = [provider, version] + list(args) def load_image_set_info(self, image_set): '''Loads the image set information, creating the providers''' d = self.get_dictionary(image_set) for image_name in d.keys(): values = d[image_name] provider, version = values[:2] if (provider, version) == (P_OMERO, V_OMERO): omero_gateway, pixels_id, z, c, t = values[2:] image_set.providers.append(OmeroImageProvider( image_name, omero_gateway, pixels_id, z, c, t)) else: raise NotImplementedError( "Can't restore file information: image provider %s and/or version %d not supported"%provider, version) def get_dictionary(self, image_set): '''Get the module's legacy fields dictionary for this image set''' key = "%s:%d"%(self.module_name, self.module_num) if not image_set.legacy_fields.has_key(key): image_set.legacy_fields[key] = {} d = image_set.legacy_fields[key] if not d.has_key(image_set.number): d[image_set.number] = {} return d[image_set.number] def prepare_group(self, pipeline, image_set_list, grouping, image_numbers): '''Load the images from the dictionary into the image sets here''' for image_number in image_numbers: image_set = image_set_list.get_image_set(image_number-1) self.load_image_set_info(image_set) def is_interactive(self): '''Tell CellProfiler that this module's run method can be executed in the worker thread''' return False def run(self, workspace): '''Run the module. Add the measurements. ''' statistics_dict = {} ratio_dict = {} for channel in self.channels: provider = workspace.image_set.get_image_provider(channel.cpimage_name.value) assert isinstance(provider, OmeroImageProvider) name = provider.get_name() omero_image_name = provider.get_omero_image_name() omero_image_id = provider.get_image_id() pixels_id = provider.get_pixels_id() z = provider.get_z() c = provider.get_c() t = provider.get_t() header = [] row = [] ratio = [] m = workspace.measurements measurements = () if self.omero_object == MS_DATASET: measurements += ((M_DATASET_NAME, self.dataset_name, 3.0), (M_DATASET_ID, self.omero_object_id.value, 1.0)) elif self.omero_object == MS_PLATE: #CellProfiler starts counting image sets from 1 well = self.wells[workspace.measurements.image_set_number-1] well_row = well.getRow().getValue() well_column = well.getColumn().getValue() well_id = well.getId().getValue() measurements += ((M_PLATE_NAME, self.plate_name, 3.0), (M_PLATE_ID, self.omero_object_id.value, 1.0), (M_WELL_ROW, well_row, 1.0), (M_WELL_COLUMN, well_column, 1.0), (M_WELL_ID, well_id, 3.0)) measurements += ((M_IMAGE_NAME, omero_image_name, 3.0), (M_IMAGE_ID, omero_image_id, 1.0), (M_PIXELS_ID, pixels_id, 1.0), (M_Z, z, 0.5), (M_C, c, 0.5), (M_T, t, 0.5)) for tag, value, r in measurements: m.add_image_measurement("_".join((tag, name)), value) header.append(tag) row.append(value) ratio.append(r) statistics = [header, row] ratio = [x / sum(ratio) for x in ratio] statistics_dict[channel.channel_number.value] = statistics ratio_dict[channel.channel_number.value] = ratio workspace.display_data.statistics = statistics_dict workspace.display_data.ratio = ratio_dict if cpp.get_headless(): #headless mode for channel in self.channels: image_name, channel_number = channel.cpimage_name.value, channel.channel_number.value print "--- image name: %s\tchannel: %s"%(image_name, channel_number) (header, row) = workspace.display_data.statistics[channel_number] for i in range(0, len(header)): print "\t%s: %s"%(header[i], row[i]) def post_run(self, workspace): '''Disconnect from the omero server after the run completes''' self.omero_client.closeSession() def display(self, workspace): if workspace.frame != None: figure = workspace.create_or_find_figure(title="OmeroLoadImages, image cycle #%d"%( workspace.measurements.image_set_number), subplots = (2, self.channel_count.value)) for channel in self.channels: image_name, channel_number = channel.cpimage_name.value, channel.channel_number.value image_set = workspace.image_set i,j = 0, int(channel_number) pixel_data = image_set.get_image(image_name).pixel_data if pixel_data.ndim == 2: figure.subplot_imshow_grayscale(i,j,pixel_data, title = image_name, vmin = 0, vmax = 1, sharex = figure.subplot(0,0), sharey = figure.subplot(0,0)) figure.subplot_table(1, int(channel_number), workspace.display_data.statistics[channel_number], ratio=workspace.display_data.ratio[channel_number]) def get_categories(self, pipeline, object_name): '''Return the categories that this module produces''' if object_name == cpmeas.IMAGE: return [C_IMAGE, C_PIXELS, C_METADATA] return [] def get_measurements(self, pipeline, object_name, category): '''Return the measurements that this module produces''' if object_name == cpmeas.IMAGE: return [meas.split('_',1)[1] for ob, meas, dtype in self.get_measurement_columns(pipeline) if meas.split('_',1)[0]==category] return [] def get_measurement_columns(self, pipeline): '''Return a sequence describing the measurement columns needed by this module''' cols = [] for channel in self.channels: name = channel.cpimage_name.value cols += [(cpmeas.IMAGE, "_".join((M_IMAGE_NAME, name)), cpmeas.COLTYPE_VARCHAR_FORMAT%255), (cpmeas.IMAGE, "_".join((M_IMAGE_ID, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_PIXELS_ID, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_Z, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_C, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_T, name)), cpmeas.COLTYPE_INTEGER)] if self.omero_object == MS_DATASET: cols += [(cpmeas.IMAGE, "_".join((M_DATASET_NAME, name)), cpmeas.COLTYPE_VARCHAR_FORMAT%255), (cpmeas.IMAGE, "_".join((M_DATASET_ID, name)), cpmeas.COLTYPE_INTEGER)] elif self.omero_object == MS_PLATE: cols += [(cpmeas.IMAGE, "_".join((M_PLATE_NAME, name)), cpmeas.COLTYPE_VARCHAR_FORMAT%255), (cpmeas.IMAGE, "_".join((M_PLATE_ID, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_WELL_ROW, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_WELL_COLUMN, name)), cpmeas.COLTYPE_INTEGER), (cpmeas.IMAGE, "_".join((M_WELL_ID, name)), cpmeas.COLTYPE_INTEGER)] return cols def change_causes_prepare_run(self, setting): '''Check to see if changing the given setting means you have to restart''' #It's safest to say that any change in OmeroLoadImages requires a restart return True #TODO: add exception handling #TODO: reconnect when gateway has been disconnected? class OmeroImageProvider(cpimage.AbstractImageProvider): '''Provide a single image based on omero pixels id''' def __init__(self, name, gateway, pixels_id, z=0, c=0, t=0): '''Initializer name - name of image to be provided gateway - provides connection to an omero server pixels_id - image id relating to the pixels z - z depth c - channel t - time index ''' self.__name = name self.__gateway = gateway self.__pixels_id = long(pixels_id) self.__z = int(z) self.__c = int(c) self.__t = int(t) self.__is_cached = False self.__cpimage_data = None self.__pixels = gateway.getPixels(pixels_id) self.__image_id = self.__pixels.getImage().getId().getValue() self.__omero_image_name = self.__gateway.getImage( self.__image_id).getName().getValue() def provide_image(self, image_set): '''load an image plane from an omero server and return a 2-d grayscale image ''' #TODO: return 3d RGB images when c == None like loadimage.py does? if self.__is_cached == True: return self.__omero_image_plane gateway = self.__gateway pixels_id = self.__pixels_id z = self.__z c = self.__c t = self.__t #Retrieve the image data from the omero server pixels = self.__pixels omero_image_plane = gateway.getPlane(pixels_id, z, c, t) #Create a 'cellprofiler' image width = pixels.getSizeX().getValue() height = pixels.getSizeY().getValue() pixels_type = pixels.getPixelsType().getValue().getValue() # OMERO stores images in big endian format little_endian = False if pixels_type == INT_8: dtype = np.char scale = 255 elif pixels_type == UINT_8: dtype = np.uint8 scale = 255 elif pixels_type == UINT_16: dtype = 'u2' scale = 65535 elif pixels_type == INT_16: dtype = 'i2' scale = 65535 elif pixels_type == UINT_32: dtype = 'u4' scale = 2**32 elif pixels_type == INT_32: dtype = 'i4' scale = 2**32-1 elif pixels_type == FLOAT: dtype = 'f4' scale = 1 elif pixels_type == DOUBLE: dtype = 'f8' scale = 1 else: raise NotImplementedError("omero pixels type not implemented for %s"%pixels_type) #TODO: should something be done here with MaxSampleValue (like loadimages.py does)? image = np.frombuffer(omero_image_plane, dtype) image.shape = (height, width) image = image.astype(np.float32) / float(scale) image = cpimage.Image(image) self.__cpimage_data = image self.__is_cached = True return image def get_name(self): '''get the name of this image''' return self.__name def get_gateway(self): '''get omero gateway''' return self.__gateway def get_pixels_id(self): '''get the pixels id''' return self.__pixels_id def get_z(self): '''get the z depth''' return self.__z def get_c(self): '''get the channel''' return self.__c def get_t(self): '''get the time index''' return self.__t def get_image_id(self): '''return the image id (note: id of the image in omero)''' return self.__image_id def get_omero_image_name(self): '''return the omero image name of this image''' return self.__omero_image_name def release_memory(self): '''Release whatever memory is associated with the image''' self.__cpimage_data = None self.__is_cached = False