def testTiles(self): from omero.model import PixelsI from omero.sys import ParametersI from omero.util.tiles import RPSTileLoop from omero.util.tiles import TileLoopIteration from numpy import fromfunction sizeX = 4096 sizeY = 4096 sizeZ = 1 sizeC = 1 sizeT = 1 tileWidth = 1024 tileHeight = 1024 imageName = "testStitchBig4K-1Ktiles" description = None tile_max = float(255) pixelsService = self.client.sf.getPixelsService() queryService = self.client.sf.getQueryService() query = "from PixelsType as p where p.value='int8'" pixelsType = queryService.findByQuery(query, None) channelList = range(sizeC) iId = pixelsService.createImage(sizeX, sizeY, sizeZ, sizeT, channelList, pixelsType, imageName, description) image = queryService.findByQuery( "select i from Image i join fetch i.pixels where i.id = :id", ParametersI().addId(iId)) pid = image.getPrimaryPixels().getId().getValue() def f(x, y): """ create some fake pixel data tile (2D numpy array) """ return (x * y) / (1 + x + y) def mktile(w, h): tile = fromfunction(f, (w, h)) tile = tile.astype(int) tile[tile > tile_max] = tile_max return list(tile.flatten()) tile = fromfunction(f, (tileWidth, tileHeight)).astype(int) tile_min = float(tile.min()) tile_max = min(tile_max, float(tile.max())) class Iteration(TileLoopIteration): def run(self, data, z, c, t, x, y, tileWidth, tileHeight, tileCount): tile2d = mktile(tileWidth, tileHeight) data.setTile(tile2d, z, c, t, x, y, tileWidth, tileHeight) loop = RPSTileLoop(self.client.sf, PixelsI(pid, False)) loop.forEachTile(256, 256, Iteration()) c = 0 pixelsService.setChannelGlobalMinMax(pid, c, tile_min, tile_max)
def testTicket4737WithForEachTile(self): pix = self.pix() class Iteration(TileLoopIteration): def run(self, data, z, c, t, x, y, tileWidth, tileHeight, tileCount): data.setTile([5]*tileWidth*tileHeight, z, c, t, x, y, tileWidth, tileHeight) loop = RPSTileLoop(self.client.getSession(), pix) loop.forEachTile(256, 256, Iteration()) pix = self.query.get("Pixels", pix.id.val) self.check_pix(pix)
def testTicket4737WithForEachTile(self): pix = self.pix() class Iteration(TileLoopIteration): def run(self, data, z, c, t, x, y, tileWidth, tileHeight, tileCount): data.setTile([5] * tileWidth * tileHeight, z, c, t, x, y, tileWidth, tileHeight) loop = RPSTileLoop(self.client.getSession(), pix) loop.forEachTile(256, 256, Iteration()) pix = self.query.get("Pixels", pix.id.val) self.check_pix(pix)
def create_image_from_tiles(conn, source, image_name, description, box, tile_size): pixels_service = conn.getPixelsService() query_service = conn.getQueryService() xbox, ybox, wbox, hbox, z1box, z2box, t1box, t2box = box size_x = wbox size_y = hbox size_z = source.getSizeZ() size_t = source.getSizeT() size_c = source.getSizeC() tile_width = tile_size tile_height = tile_size primary_pixels = source.getPrimaryPixels() def create_image(): query = "from PixelsType as p where p.value='uint8'" pixels_type = query_service.findByQuery(query, None) channel_list = range(size_c) # bytesPerPixel = pixelsType.bitSize.val / 8 iid = pixels_service.createImage( size_x, size_y, size_z, size_t, channel_list, pixels_type, image_name, description, conn.SERVICE_OPTS) return conn.getObject("Image", iid) # Make a list of all the tiles we're going to need. # This is the SAME ORDER that RPSTileLoop will ask for them. zct_tile_list = [] for t in range(0, size_t): for c in range(0, size_c): for z in range(0, size_z): for tile_offset_y in range( 0, ((size_y + tile_height - 1) / tile_height)): for tile_offset_x in range( 0, ((size_x + tile_width - 1) / tile_width)): x = tile_offset_x * tile_width y = tile_offset_y * tile_height w = tile_width if (w + x > size_x): w = size_x - x h = tile_height if (h + y > size_y): h = size_y - y tile_xywh = (xbox + x, ybox + y, w, h) zct_tile_list.append((z, c, t, tile_xywh)) # This is a generator that will return tiles in the sequence above # getTiles() only opens 1 rawPixelsStore for all the tiles # whereas getTile() opens and closes a rawPixelsStore for each tile. tile_gen = primary_pixels.getTiles(zct_tile_list) def next_tile(): return tile_gen.next() class Iteration(TileLoopIteration): def run(self, data, z, c, t, x, y, tile_width, tile_height, tile_count): tile2d = next_tile() data.setTile(tile2d, z, c, t, x, y, tile_width, tile_height) new_image = create_image() pid = new_image.getPixelsId() loop = RPSTileLoop(conn.c.sf, PixelsI(pid, False)) loop.forEachTile(tile_width, tile_height, Iteration()) for the_c in range(size_c): pixels_service.setChannelGlobalMinMax(pid, the_c, float(0), float(255), conn.SERVICE_OPTS) return new_image
def testTiles(self): from omero.model import PixelsI from omero.sys import ParametersI from omero.util.tiles import RPSTileLoop from omero.util.tiles import TileLoopIteration from numpy import fromfunction sizeX = 4096 sizeY = 4096 sizeZ = 1 sizeC = 1 sizeT = 1 tileWidth = 1024 tileHeight = 1024 imageName = "testStitchBig4K-1Ktiles" description = None tile_max = float(255) pixelsService = self.client.sf.getPixelsService() queryService = self.client.sf.getQueryService() query = "from PixelsType as p where p.value='int8'" pixelsType = queryService.findByQuery(query, None) channelList = range(sizeC) iId = pixelsService.createImage( sizeX, sizeY, sizeZ, sizeT, channelList, pixelsType, imageName, description) image = queryService.findByQuery( "select i from Image i join fetch i.pixels where i.id = :id", ParametersI().addId(iId)) pid = image.getPrimaryPixels().getId().getValue() def f(x, y): """ create some fake pixel data tile (2D numpy array) """ return (x * y) / (1 + x + y) def mktile(w, h): tile = fromfunction(f, (w, h)) tile = tile.astype(int) tile[tile > tile_max] = tile_max return list(tile.flatten()) tile = fromfunction(f, (tileWidth, tileHeight)).astype(int) tile_min = float(tile.min()) tile_max = min(tile_max, float(tile.max())) class Iteration(TileLoopIteration): def run(self, data, z, c, t, x, y, tileWidth, tileHeight, tileCount): tile2d = mktile(tileWidth, tileHeight) data.setTile(tile2d, z, c, t, x, y, tileWidth, tileHeight) loop = RPSTileLoop(self.client.sf, PixelsI(pid, False)) loop.forEachTile(256, 256, Iteration()) c = 0 pixelsService.setChannelGlobalMinMax( pid, c, tile_min, tile_max)