def xySlice ( self, fileobj ): zdim,ydim,xdim = self.data.shape imagemap = np.zeros ( [ ydim, xdim ], dtype=np.uint32 ) # false color redrawing of the region recolor_cy ( self.data.reshape((imagemap.shape[0],imagemap.shape[1])), imagemap ) outimage = Image.frombuffer ( 'RGBA', (xdim,ydim), imagemap, 'raw', 'RGBA', 0, 1 ) outimage.save ( fileobj, "PNG" )
def yzSlice ( self, scale, fileobj ): zdim,ydim,xdim = self.data.shape imagemap = np.zeros ( [ zdim, ydim ], dtype=np.uint32 ) # false color redrawing of the region recolor_cy ( self.data.reshape((imagemap.shape[0],imagemap.shape[1])), imagemap ) outimage = Image.frombuffer ( 'RGBA', (ydim,zdim), imagemap, 'raw', 'RGBA', 0, 1 ) newimage = outimage.resize ( [ydim, int(zdim*scale)] ) newimage.save ( fileobj, "PNG" )
def tile2WebPNG ( self, xdim, ydim, tile ): """Create PNG Images and write to cache for the specified tile""" # write it as a png file if self.dbtype == dbtype.IMAGES_8bit : return Image.frombuffer ( 'L', [xdim,ydim], tile.flatten(), 'raw', 'L', 0, 1 ) elif self.dbtype == dbtype.ANNOTATIONS : recolor_cy (tile, tile) return Image.frombuffer ( 'RGBA', [xdim,ydim], tile.flatten(), 'raw', 'RGBA', 0, 1 ) elif self.dbtype == dbtype.IMAGES_16bit : outimage = Image.frombuffer ( 'I;16', [xdim,ydim], tile.flatten(), 'raw', 'I;16', 0, 1) outimage = outimage.point(lambda i:i*(1./256)).convert('L') elif self.dbtype == dbtype.RGB_32bit : outimage = Image.fromarray( tile, 'RGBA') else : logger.warning ( "Datatype not yet supported".format(self.dbtype) ) return outimage
def cacheMiss ( self, resolution, xtile, ytile, zslice ): """On a miss. Cutout, return the image and load the cache in a background thread""" # make sure that the tile size is aligned with the cubedim if self.tilesz % self.proj.datasetcfg.cubedim[resolution][0] != 0 or self.tilesz % self.proj.datasetcfg.cubedim[resolution][1]: raise("Illegal tile size. Not aligned") # figure out the cutout (limit to max image size) xstart = xtile*self.tilesz ystart = ytile*self.tilesz xend = min ((xtile+1)*self.tilesz,self.proj.datasetcfg.imagesz[resolution][0]) yend = min ((ytile+1)*self.tilesz,self.proj.datasetcfg.imagesz[resolution][1]) # get an xy image slice imageargs = '{}/{},{}/{},{}/{}/'.format(resolution,xstart,xend,ystart,yend,zslice) cb = ocpcarest.xySlice ( imageargs, self.proj, self.db ) if cb.data.shape != (1,self.tilesz,self.tilesz): tiledata = np.zeros((self.tilesz,self.tilesz), cb.data.dtype ) tiledata[0:((yend-1)%self.tilesz+1),0:((xend-1)%self.tilesz+1)] = cb.data[0,:,:] else: tiledata = cb.data # need to make polymorphic for different image types if tiledata.dtype == np.uint8: outimage = Image.frombuffer ( 'L', (self.tilesz,self.tilesz), tiledata, 'raw', 'L', 0, 1 ) elif tiledata.dtype == np.uint32: tiledata = tiledata.reshape([self.tilesz,self.tilesz]) recolor_cy (tiledata, tiledata) outimage = Image.frombuffer ( 'RGBA', [self.tilesz,self.tilesz], tiledata, 'raw', 'RGBA', 0, 1 ) else: #added by PJM to support probmap type. tiledata = np.uint8(tiledata*256) outimage = Image.frombuffer ( 'L', (self.tilesz,self.tilesz), tiledata, 'raw', 'L', 0, 1 ) #assert 0 # need to fix here and add falsecolor args return outimage
def tile2WebPNG ( self, tile, color, brightness ): """Create PNG Images for the specified tile""" if color != None: # 16 bit images map down to 8 bits if tile.dtype == np.uint16: tile = np.uint8(tile/256) # false color the image if tile.dtype != np.uint8: raise ("Illegal color option for data type %s" % ( tile.dtype )) else: tile = self.falseColor ( tile, color ) img = Image.frombuffer ( 'RGBA', [self.tilesz,self.tilesz], tile.flatten(), 'raw', 'RGBA', 0, 1 ) # enhance false color images when requested if brightness != None: # Enhance the image from PIL import ImageEnhance enhancer = ImageEnhance.Brightness(img) img = enhancer.enhance(brightness) return img else: # write it as a png file if tile.dtype==np.uint8: return Image.frombuffer ( 'L', [self.tilesz,self.tilesz], tile.flatten(), 'raw', 'L', 0, 1 ) elif tile.dtype==np.uint32: recolor_cy (tile, tile) return Image.frombuffer ( 'RGBA', [self.tilesz,self.tilesz], tile.flatten(), 'raw', 'RGBA', 0, 1 ) elif tile.dtype==np.uint16: outimage = Image.frombuffer ( 'I;16', [self.tilesz,self.tilesz], tile.flatten(), 'raw', 'I;16', 0, 1) outimage = outimage.point(lambda i:i*(1./256)).convert('L') return outimage
def catmaidSlice( self ): cmtilesz = self.data.shape[0] recolor_cy( self.data, self.data ) self.data = Image.frombuffer ( 'L', [cmtilesz,cmtilesz], self.data, 'raw', 'RGBA', 0, 1 )